一、推导式

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

利用列表推导式,取出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 at 0x01760960>

需要用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了。

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

  1. Python迭代器生成器,模块和包

      1.迭代器和生成器 2.模块和包 1.迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法.    其中__it ...

  2. Python_迭代器、生成器、列表推导式,生成器表达式

    1.迭代器 (1)可迭代对象 s1 = ' for i in s1: print(i) 可迭代对象 示例结果: D:\Python36\python.exe "E:/Python/课堂视频/ ...

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

    一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(r ...

  4. python基础知识15---三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

    阅读目录 一 三元表达式.列表推导式.生成器表达式 二 递归与二分法 三 匿名函数 四 内置函数 五 阶段性练习 一. 三元表达式.列表推导式.生成器表达式 1 三元表达式 name=input('姓 ...

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

    l = [i for i in range(10)] print(l) l1 = ['选项%s'%i for i in range(10)] print(l1) 1.把列表解析的[]换成()得到的就是 ...

  6. python全栈开发 生成器 :生成器函数,推导式及生成器表达式

    python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), ...

  7. Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数

    Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: ​ 就是迭代器 生成器产生的方式: ​ 1.生成器函数

  8. python基础17_列表推导式 vs 生成器表达式

    [ ] 列表推导式,是用简单的语法来生成列表, ( ) 生成器表达式,是用简单的语法创建个生成器. 外观上仅括号不一样. 虽然写起来方便,但是读起来稍显费力,另外,不易调试. # 列表推导式 prin ...

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

    http://www.cnblogs.com/linhaifeng/articles/7580830.html 三元表达式.列表推导式.生成器表达式.递归.匿名函数.内置函数

  10. python 三元表达式、列表推导式、生成器表达式

    一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='mm' if name == 'hahah' else 'NB' print( ...

随机推荐

  1. win10 创建安卓模拟器及启动的方法

    一打开 安卓 studio 然后点击AVD manager 创建一个模拟器 二 通过命令行快速启动模拟器 D:\Android\sdk\tools\emulator.exe -netdelay non ...

  2. form的action属性作用

    一.action=""和action="#".没有action属性的作用相同,都是提交到当前页面(也就是document.location.href) 二.ac ...

  3. hibernate,mybatis,beetlsql 全面比較

    这是我的一个综合评分.总共分为12个单项.每一个单项最高5分.最低0分. 注意.评价仅仅包括这些软件提供的标准功能,不包括第三方提供的功能,如代码生成等. 开发效率 hibernate  能获取数据库 ...

  4. 【Hadoop】Hadoop 机架感知配置、原理

    Hadoop机架感知 1.背景 Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份, 同机架内其它某一节点上一份,不同机架的某一节点上一份. 这样如果本地 ...

  5. CKEditor+SWFUpload实现功能较为强大的编辑器(三)---后台接收图片流程

    在前台配置完CKEditor和SWFUpload之后就可以满足基本的需求了 在这里,我配置的接收异步上传的图片的页面为upload.ashx 在这个ashx中对上传的图片处理的流程如下: contex ...

  6. 2017.10.13 unable to open debugger port(127.0.0.1:10308)

    参考来自:http://blog.csdn.net/qq_34360219/article/details/76169653 1.场景 突然间IDEA就跑不起项目了,报了如下的错误:unable to ...

  7. node - 上传文件并且修改名称

    html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  8. vue笔记三(组件)

    十.组件 1.组件中的data为函数 2.props: 父组件向子组件传递数据 子组件:Child.vue <template> <span>{{ myMsg }}</s ...

  9. psql命令行快速参考

    psql的命令语法是: psql [options] [dbname [username]] psql命令行选项以及它们的意思在表1-1中列出.使用以下命令可以看到psql完整的选项列表: $ psq ...

  10. Au cs6怎样才能导入和导出m4a或者就是aac格式的文件呢?

        [求解]Au cs6怎样才能导入和导出m4a或者就是aac格式的文件呢?   汉化版;解决发法----首选项------常规------媒体与暂存盘-----动态链接媒体下面的启动DLMS格式 ...