Python 推导式、迭代器、生成器、模块和包

一、推导式

(一).列表推导式(集合推导式也同理于此)

利用列表推导式,取出1-20内所有偶数

li = [i for i in range(1, 21) if i % 2 == 0] # 如果只有一个条件,要把if语句写在最后面

第一个i是放入列表的值,后面都是推导的公式

print(li)

第一个 i 相当于下面等价方案中的 append(i)。把 i 换成 "a" ,输出的列表中全是 "a"

等价于

for i in range(1,21):

if i%2==0:

li.append(li)

print(li)

利用列表推导式,取出1-20内所有数。其中奇数用字符"a"代替,偶数则正常输出

li = [i if i % 2 == 0 else "a" for i in range(1, 21)] # 添加多个条件的时候,要写在前面

print(li)

列表推导式练习:将列表 li=[‘a‘,‘b‘,‘c‘,‘d‘,‘e‘] 倒序

print([li.pop() for i in range(len(li))])

pop()函数,remove and return the last element

(二).字典推导式

例1:

a = {str(i): i for i in range(5)}

print(a) # {‘0‘: 0, ‘1‘: 1, ‘2‘: 2, ‘3‘: 3, ‘4‘: 4}

例2:

a = {"i": i for i in range(5)}

print(a) # {‘i‘: 4}

因为字典的键是唯一的,“例2”中的这个推导式,把键的名字给写死了,每一次推导其实都是在修改原先的值。

例3:

print({i: ‘a‘ for i in range(5)})

{0: ‘a‘, 1: ‘a‘, 2: ‘a‘, 3: ‘a‘, 4: ‘a‘}

“例3”是把值给写死了。相当于dict.fromkeys([0,1,2,3,4],"a")

(三).元祖的话,是返回一个生成器对象:

print((i for i in range(5)))

<generator object

需要用tuple()来查看:

print(tuple(i for i in range(5)))

(0, 1, 2, 3, 4)

二、迭代器

查看一个对象是否可迭代,使用dir(li)方法,结果中出现了 "iter" 就是可迭代。

使用dir(li)查看,要有 "iter" 和 "next" 才算是一个迭代器。

枚举就是个迭代器

g = enumerate([1, 2, 3])

print(dir(g))

dir(g) 后,可以看到有 "iter" 和 "next"

(一).__iter__() 和 next():

(1).__iter__()把一个可迭代的对象变成迭代器。

li = [1, 2, 3]

g = li.__iter__() # 用这个方法变成迭代器

print(g.__next__()) # 实现迭代器(通俗理解:取值)

要赋值给一个变量。不然__next__()每次都是取第一个值

下面这样写,取的永远都是迭代器中的第一个值

print(li.__iter__().__next__())

print(li.__iter__().__next__())

print(li.__iter__().__next__())

这里就理解:!迭代器对象,必须赋值给一个变量接受!

(2).__next__(),实现迭代器,本质就是取出迭代器的下一个元素。注意:元素取完了,如果再 next() 就会报 StopIteration 异常!

li = [1, 2, 3]

g = iter(li)

print(next(g)) # 这里已经把第一个元素取出了

print("---")

for i in g: # 所以这里只会取出后面的2个值

print(i)

三、生成器 generator

在python中,使用了关键字yield的函数被成为生成器。本质上是迭代器,关键字:yield

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作。

在调用生成器运行的过程中,每次遇到yield时,函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行next()方法时,从当前位置继续运行。:

如下演示一个简单的生成器:

def fun():

i = 1

while i < 5:

print(i)

# yield # 实现生成器的功能。1、暂停,2、返回值。

yield "stop" # 可以这样写,返回一个信息

i += 1

print("**", i)

print(fun()) # 这里返回了一个内存地址

f = fun()

print(next(f))

使用yield演示斐波那契:

def fab(max_num):

n, a, b = 0, 0, 1

while n < max_num:

yield "暂停 打印b:", b

a, b = b, a + b

n += 1

for x in fab(20):

print(x)

四、模块和包

(一).模块:本质上就是py文件。分为:内置模块,第三方模块。

(1).内置模块的使用:

导入所有内容:import modulename;很直观,但很占内存。

指定导入:from modulename import funcationname;明确知道自己要用什么方法。

(2).自定义模块的使用:

与当前py文件是同级路径:直接导入。

不同路径导入的参考:

import sys # 别忘了先导入这个

sys.path # 路径先调出来。返回一个列表,是python的安装目录

sys.path.append(r"") # 小括号内可添加自己py文件的绝对路径,记得取消转义

再 import modulename 就可以了

(3).得在自己写的py文件的最后一行加入:

if name == ‘main‘:

functionname1()

functionname2()

有这段代码。测试是本身就有,还是导入进来的。

一定要对这个py文件本身执行,运行了,才会有结果。

(二).包:很多py文件放在一个文件夹中。

(三).if name == ‘main‘:

就是个if判断,‘main‘就是个字符串,判断是导入的还是直接执行的。

当import一个py模块(文件)的时候,会把那个py模块(文件)执行一遍。

例1:

我有一个"test1.py"的模块(文件),如下代码:

import test2

print(name) # main

print(test2.__name__) # test2

"""

运行结果:

fengzi111

main

test2

"""

有另一个"test2.py"的文件,如下代码:

print("fengzi111")

if name == ‘main‘:

print("fengzi222")

"test1.py"中,import了"test2",那么"test2.py"就被执行了一遍。所以在"test1.py"的运行结果中,会出现fengzi111,因为 import test2 的时候,"test2.py"被执行了一遍。

为什么打印不出fengzi222?

"test2.py"是被引入进"test1.py"中的。"test2.py"中就有了if判断,判断的结果:它们两个不是同一个name。

看"test1.py"文件中的这条代码 print(test2.__name__),这条代码特意显示了一下"test2.py"是什么名字。返回的结果是 test2,但现在执行的是"test1.py"这个文件呀!"test1"=="test2"吗?显然是False,那就不会有fengzi222了。

原文地址:https://www.cnblogs.com/xuanlv-0413/p/9276226.html

时间: 2024-10-29 12:08:55

Python 推导式、迭代器、生成器、模块和包的相关文章

Python之推导式、生成器表达式

l = [i for i in range(10)] print(l) l1 = ['选项%s'%i for i in range(10)] print(l1) 1.把列表解析的[]换成()得到的就是生成器表达式 2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存 3.Python不但使用迭代器协议,让for循环变得更加通用.大部分内置函数,也是使用迭代器协议访问对象的.例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议

Python 列表\集合\ 字典推导式、生成器表达式

Python 列表\集合?字典推导式.生成器表达式 列表推导式 循环模式 l1 = [i for i in range(1,11)] l2 = [i ** 2 for i in range(100)] l3 = [f'python{i}' for i in range(50)] 筛选模式: l1 = [i for i in range(1,31) if i % 3 == 0] 嵌套循环: names = [['tom','billy','jefferson'],['wesley','steven

day14,列表推导式,生成器表达式,内置函数

一.列表推导式.生成器表达式: # li = []# for i in range(1,101):# li.append(i)# print(li) #l1 = [python1期,python2期,python3期.....]# l1 = []# for i in range(1,12):# l1.append('python%s期' % i)# print(l1)#一行搞定,列表推导式:用列表推导式能够构建的任何列表,用别的都可以构建.#一行,简单,感觉高端.但是,不易排错.# li = [

三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

一 三元表达式.列表推导式.生成器表达式 1.三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(res) 2.列表推导式 #1.示例 egg_list=[] for i in range(10): egg_list.append('鸡蛋%s' %i) egg_list=['鸡蛋%s' %i for i in range(10)] #2.语法 [expression for item1 in iterabl

part4-2 流程控制二(循环结构,while、for循环,列表推导式、生成器推导式,常用工具函数,控制循环结构,4个简单实例)

循环语句在循环条件满足时,可反复执行某一段代码,这段被重复执行的代码称为循环体.在循环体中,需要在合适的时候把循环条件设置为假,从而结束循环:否则循环一直执行下去形成死循环.循环语句通常包含如下4个部分.(1).初始化语句(init_statements):在循环开始前执行,有一条或多条语句,用于完成一些起初始化工作.(2).循环条件(test_expression):一个布尔表达式,决定是否执行循环体.(3).循环体(body_statements):循环的主体,根据循环条件是否允许,这个代码

六 三元表达式、列表推导式、生成器表达式

一 三元表达式 二 列表推导式 三 生成器表达式 一 三元表达式 1 name=input('姓名>>: ') 2 res='abc' if name == 'lucy' else 'jack' 3 print(res) 二 列表推导式 #1.示例 egg_list=[] for i in range(10): egg_list.append('鸡蛋%s' %i) egg_list=['鸡蛋%s' %i for i in range(10)] #2.语法 [expression for ite

Python3 三元表达式、列表推导式、生成器表达式

Python3 三元表达式.列表推导式.生成器表达式 三元表达式 表达式中,有三个元素 name = input("请输入姓名: ")ret = '输入正确' if name == 'aaa' else '输入错误'print(ret)  列表推导式 #1.示例# 方法1egg_list1 = []for i in range(10): egg_list1.append('鸡蛋%s' % i)print(egg_list1) #方法2egg_list2 = ['鸡蛋%s' %i for

列表推导式和生成器表达式

# 列表推导式 lis = [i for i in range(10)] print(lis) # 生成器表达式 crt = (i for i in range(10)) print(crt) print(crt.__next__()) print(crt.__next__()) print(crt.__next__()) #打印: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <generator object <genexpr> at 0x00000188F0FED9

python 推导式和迭代器、生成器

1.常用推导式 推导式是从一个或者多个迭代器快速简洁创建数据结构的一种方法. 1.1 _ 列表推导式 最简单的形式:  [exprssion for item in iterable] 示例:  number_list = [x for x in range(1,10)]  加上条件表达式的形式:  [exprsssion for item in iterable if condition]  示例: a_list = [x for x in range(1,7) if x %2 ==1] 多个