1.迭代器和生成器
1.迭代器
#列表推导式:扩展操作,简化代码 >>> l3=[i for i in range(20) if i%2==1] #第一个i,就是往列表里面添加的value >>>l3=[i if i%2==1 else "a" for i in range(20) ] #偶数替换成“a”,奇数用i值 #集合推导式 >>> s={i for i in range(10)} >>> s {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} #字典推导式 >>> s={i:"a" for i in range(5)} >>> s {0: 'a', 1: 'a', 2: 'a', 3: 'a', 4: 'a'} #迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法。 其中__iter__()方法返回迭代器对象本身;__next__()方法返回容器的下一个元素,在结尾时引发StopIteration异常。 ''' >>> l3=[i for i in range(20) if i%2==0] #__iter__有这个魔法方法,具备可以迭代 >>> li=iter(l3) >>> next(li) 0 >>> l3=[i for i in range(20) if i%2==0] >>> l3=l3.__iter__() >>> next(l3) 0 >>> l3.__next__() 2 iter() 实现了 __iter__() next() 实现了 __next__() ''' #迭代器是用来干嘛 for: 1.iter() ->迭代器 2.next()->迭代取值 extend(iterable)->iter()->next()->append()
2.生成器generator
在Python中,使用生成器可以很方便的支持迭代器协议。 生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果,在每个结果之间挂起和继续它们的状态,来自动实现迭代协议。 也就是说,yield是一个语法糖,内部实现支持了迭代器协议,同时yield内部是一个状态机,维护着挂起和继续的状态。 生成器函数返回生成器的迭代器。 “生成器的迭代器”这个术语通常被称作”生成器”。 要注意的是生成器就是一类特殊的迭代器。作为一个迭代器,生成器必须要定义一些方法, 其中一个就是__next__()。如同迭代器一样,我们可以使用__next__()函数来获取下一个值。 在一个 generator function 中,如果没有 return,则默认执行至函数完毕,如果在执行过程中 return, 则直接抛出 StopIteration 终止迭代。 #yield用来处理批量数据的,查看部分数据,防止内存爆了 ''' def fun(): i=0 while i<5: print("***") yield i #暂停使用,同时还可以返回值 i+=1 print("+++",i) #运行结果: >>> next(a) *** 0 >>> next(a) +++ 1 *** 1 ''' >>>next(fun()) #每次调用,都会生成一个对象 # 斐波那契数 def fib(num): n,a,b=0,0,1 while n<num: print(b) if n%10==0: yield #用来处理批量数据的,查看部分数据,防止内存爆了 a,b=b,a+b n=n+1
2.模块和包
1.内置模块 本身就带有的库,就叫做Python的内置的库。(模块==库) 一些常见的内置模块 os 和操作系统相关 os.path sys 和系统相关 sys.path sys.path.append(r'') 可以添加路径 re 正则表达式 2.第三方模块 非Python本身自带的库,就是所谓的第三方的库 3.模块的导入,模块的本质就是一个py文件 import xxx [as yy] from ../xx import xx [as yy] ''' >>> import keyword #会把模块里面所有的内容都导入 >>> from random import randint #指定导入,节省内存 >>> from random import* #会把模块里面所有的内容导入,但是不会导入 _cos,带下划线的私有属性 ''' 4.自定义模块 py文件,可以做为一个模块来用,直接作为一个模块导入就行 __main__ 的意义: 当文件是直接运行是,文件的__name__是__main__ ,当文件是被导入时,__name__是文件名 ''' #py 声明了name相当于声明主权 if __name__=="__main__": #我自己调用,才会执行 print(__name__) ''' ''' #添加自定义引用的第三方库 >>> import os,sys >>> sys.path >>> sys.path.append(r"C:\Users\xxxx\Desktop\test") #指定你的目录 >>> sys.path >>> import test3 #C:\Users\xxxx\Desktop\test 引用目录下test3.py文件 test ''' 5.包管理 基本上就是另外一类模块。把用来处理一类事物的多个文件放在同一文件夹下组成的模块集。 要让python 将其作为包对待,在python2中必须包含__init__.py的文件,但在python3中没有__init__.py文件也可以,使用包可以避免多个文件重名的情况,不同的包下的文件同名不影响。 导入包和模块是一样的方法,包导入后会在目录中自动生成__pycache__文件夹存放生成的.pyc文件,要注意的是import后面的才是存在当前作用域中的对象名,from是告诉python从什么地方导入, 使用sys.path添加文件的目录路径。 ''' >>> import xml >>> import xml.dom #不是系统的包就添加路径 ''' import time >>>time.localtime() >>>time.asctime(time.localtime()) >>>time.time() #时间戳
3.扩展外传参数
#cmd中调用: python3 C:\Users\xxx\Desktop\python\test.py "test" "a" import sys def test(): print("this is test") a="test" return a test1="this is test" if __name__=="__main__": #我自己调用,才会执行 print(__name__) sys.argv print(sys.argv) print(sys.argv[1]) print(sys.argv[2]) test() #运行结果: __main__ ['C:\\Users\\xxx\\Desktop\\python\\test.py', 'test', 'a'] test a this is test
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!