1、Python3迭代器与生成器迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不 会后退。迭代器有两个基本的方法:iter()和next()。字符串,列表或元组对象都可用于创建迭代器: 11print#创建e代器対象fr输出迭代器的下一个元壷1234迭代器对象可以使用常规for语句进行遍历:#!/uEr/bin/pythons,3,4it = iter (list) #创建迭代器对象 fan K in it:priFvt (町 encl=)执行以上程序,输岀结。
2、果如下:也可以使用next()函数:ft! / usr/bin/py thonSimport sys1七=iterfList ) 羊创崖迭代器jTl象uihil-e Truettry:print (nextit) except S.topiteation:sys,exi+)执行以上程序,输岀结果如下:创建一个迭代器把一个类作为一个迭代器使用需要在类中实现两个方法iter_0 与 _n ext__()。Python的构造函数为 _init如果你已经了解的面向对象编程,就知道类都有一个构造函数, (),它会在对象初始化的时候执行。_n ext__()方法并通过 St__iter__()方法返回一个。
3、特殊的迭代器对象,这个迭代器对象实现了 op Iteration异常标识迭代的完成。__next__()方法(Python 2里是next()会返回下一个迭代器对象。class MyNumbsrs: def _iter_(self);Si e 1 f. a = 1return 5=lfde-f _ next C self):X 二 self&elf.d += 1returr x mycla 5S = My NijintJers () iwiyiteir - iter(in/class) pri ft (n ext ( my it er) 卩广Lnt ( riexhi(myiter ) pr i。
4、rvt (next (my it er) print i(next(iiiyiten) print(next(myIter)J执行输岀结果为:Sto pl terati on__next__()方法中我们stop Iteration异常用于标识迭代的完成,防止岀现无限循环的情况,在可以设置在完成指定循环次数后触发Sto piteration异常来结束迭代。在20次迭代后停止执行:claesL HyWumfcersidef ier(self):self , fl 二 1return eelfdef _next_self);if self.a def helio():print(Hello Wor。
5、ld! )hello() Hello World!更复杂点的应用,函数中带上参数变量牡! /iLisr/ bin/pythonStt计算面穆函勤def area(widthj. height : return width * heightdef print_weleone(name):print(welcomeJ name)printjvelcomeCRurioob)w = 4h = 5print (width vr, height =h, arsa = areah)以上实例输岀结果:WelcomeRunoob width =4 height =5 area =20函数调用定义一个函数:给了函。
6、数一个名称,指定了函数里包含的参数,和代码块结构。提示符执行。如下实例调用了prin tme()函数:# Vus rfbinpython 3定買数def pri.ntine( str ):#打阳任何传入的宇蒔串print C5tr)returnfr调用ffl数p广int低我裏调用用户自宦义函数!JPrintiiieC再次调用同一函数、Python命令这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从以上实例输岀结果:我要调用用户自定义函数!再次调用同一函数参数传递在python中,类型属于对象,变量是没有类型的:a= 1,2,3a=zuomu以上代码中,1,2,3是List。
7、类型,Runoob 是String类型,而变量 a是没有类型,她仅仅是一个对象的引用(一个指针),可以是指向List类型对象,也可以是指向String类型对象。可更改(mutable)与不可更改(immutable)对象在python中,strings, tuples,和numbers是不可更改的对象,而list,dict等则是可以修改的对象。? 不可变类型:变量赋值a=5后再赋值a=10,这里实际是新生成一个int值对象10 ,再让a指向它,而5被丢弃,不是改变 a的值,相当于新生成了可变类型:变量赋值la=1,2,3,4后再赋值la2=5则是将list la的第三个元素值更改,本身la没有。
8、动,只是其内部的一部分值被修改了。python函数的参数传递: ? 不可变类型: 类似C+的值传递,如整数、字符串、元组。如 fun (a),传递的只是 a的值,没有影响a对象本身。比如在 fun (a)内部修改a的值,只是修改另一个复制的对象,不会影响a本身。可变类型:类似C+的引用传递,如列表,字典。女nfun (la),则是将la真正的传过去,修改后fun外部的la也会受影响python中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。python传不可变对象实例jt i/usn/bin/pythonldef 匚hangelnit( b ):a =。
9、 IQb M 2Change工nt(b)pirin-t( b ) # 结果是 2实例中有int对象2,指向它的变量是b,在传递给ChangeInt函数时,按传值的方式复制了变量b, a和b都指向了同一个Int对象,在a=10时,则新生成一个int值对象10,并让a指向 它。传可变对象实例可变对象在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。例如:#! /usr/lbinr python3 #可写函皴说明def changeine nylist僮efe传入的列丧”nylist .appendl( 123,4) print 数內取值:J mylist) return# 调用。
10、changemeSSrnnylist = IB, 2艮死print (S埶外取值:inylist )传入函数的和在末尾添加新内容的对象用的是同一个引用。故输岀结果如下:函数内取值:10, 20, 30, 1, 2, 3, 4函数外取值:10, 20, 30, 1, 2, 3, 4参数以下是调用函数时可使用的正式参数类型:必需参数关键字参数?默认参数不定长参数必需参数必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。调用printme()函数,你必须传入一个参数,不然会岀现语法错误:# ! /ii5r/bin/python3#可写a数说明def Printme( 5tr : ”打E。
11、U任何传典的寧符串” print (st r)return#调用printme函數,不抽缕勘会抿愴 P r in+rne以上实例输岀结果:Traceback ( most recent call last ):File test.py, line 10, in :strprintme ()TypeError : printme () missing 1 required positional argument关键字参数关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。Python解释器能够用参数使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为名匹配参数值。以下实。
12、例在函数 prin tme()调用时使用参数名:吐 i/us r/bin/python3?1可写函勘说朋def purinine stn ):打印任何传入的字符串-print (str)return赴调用prH.rvtrn己函数p厂irvtm珂Str =菜乌数程)以上实例输岀结果:菜鸟教程以下实例中演示了函数参数的使用不需要使用指定顺序:ft! Zusr/bin/ pythcn3#可写函数说明dief printinfo( nene, age ); “打印任何传入的宝WS” pi-zLn1z (名字=* J name ) print年龄:age) return祥调用p rintinfoiS数p。
13、riirtin*o( a=n3ine=ninoo匕以上实例输岀结果:名字:runoob年龄:50默认参数age参数,则调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入使用默认值:/usr/lbinZpython3#可写a教说朋def printinfo( name, age = 35 ): ”打印任何传入的宇符串” print (E 名宇;J n ame print年SS: ireturn调用print i nf 口函勘naine=runootprintinfof &百&=亍灯= runoob J pfi吐(-Jpri ntinfof以上实例输岀结果:名字:zuomu年龄。
14、:23名字:zuomu年龄:23不定长参数你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述参数不同,声明时不会命名。基本语法如下:def functionname ( formal_args ,* var_args_tuple):函数_文档字符串function suitereturn exp ression加了星号*的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。! /u&r/bin/pythonSP可写函數说明def printin百of Qrglj *yartuple ): “打用任何传入的蜃埶 print (输出: print (argl。
15、)print (vartuiple)# 调printinfo 函數Printinfo( 70&0 $50以上实例输岀结果:输出:(60,50)如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量。如下实例:704 ! /u r/lbln/python3rt可写函麺说朋def printinfo( arglj *打印任何诗入的盏埶 print输出= prirrt (弓glj for vsr in vartuiple:print(V3 r)return吐调用print in-fp怪I数printinfo( 16 )print info(GO, 50 )以上实例输岀结果。
16、:输出:10输出:706050还有一种就是参数带两个星号*基本语法如下:def functionname ( formal_args ,* var_args_dict ):函数文档字符串-function suitereturn exp ression加了两个星号*的参数会以字典的形式导入。# r/bin/pythffn3 #可写函數说明def printinf0( arglj广diet J:“打印任何隹入的盪数 print输岀 f print (argl) print (vardict Jtt iji) Sprint info 画數以上实例输岀结果:输出:a :2,b : 3声明函数时,参数。
17、中星号 *可以单独岀现,例如def f ( a, b,*, c):return a+b+c如果单独岀现星号 *后的参数必须用关键字传入。def f (a, b,*, c):. return a+b+c f ( 1, 2, 3)# 报错Traceback (most recent call last ):File , line 1, in 3 were givenTypeError : f() takes 2 positional arguments but f (1,2, c=3)# 正常6 匿名函数python使用lambda来创建匿名函数。所谓匿名,意即不再使用def语句这样标准的形式定义。
18、一个函数。lambda只是一个表达式,函数体比def简单很多。lambda表达式中封装有限的逻lambda的主体是一个表达式,而不是一个代码块。仅仅能在辑进去。lambda函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。虽然lambda函数看起来只能写一行,却不等同于C或C+的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。语法lambda函数的语法只包含一个语句,如下:lambda arg1 , arg2 ,argn : expression如下实例:T*! Zusr/lbin/pythonl#可写函数说阴sum = lambda arglj a广吕。
19、2: argl+ a.-g2#调用5 M碰J数print r相加后的値掏LJii( print (相加启的值为:”以上实例输岀结果:相加后的值为:30相加后的值为:40return 语句return 表达式语句用于退岀函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,以下实例演示了return语句的用法:tS/usn/biniy python 号可写函数说明def suw( argl,J;#返回2个参数的和tot a 1 = cirgl 十 arg2pMnt (函埶內total) return total#调用510函数otaL 。
20、= sumi( 1 比 201 )print圈数外;, tQ-tsl)以上实例输岀结果:函数内:30函数外:30强制位置参数Python3.8新增了一个函数形参语法/用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式。在以下的例子中,形参 a和b必须使用指定位置参数, C或d可以是位置形参或关键字形参,而 e或f要- 求为关键字形参:def f(a, b,/, c , d ,*, e , print ( a, b , c , d , e , f ):以下使用方法是正确的f (10, 20, 30, d =40, e =50,=60)以下使用方法会发生错误=50, f =60)# b不能使用关键字参数的形式f (10, b =20, c =30, d =40,f (10, 20, 30,40, 50, f =60)# e必须使用关键字参数的形式。