1. 迭代器
迭代是Python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:
>> > list= [ 1 , 2 , 3 , 4 ]
>> > it = iter ( list) # 创建迭代器对象
>> > print ( next ( it) ) # 输出迭代器的下一个元素
1
>> > print ( next ( it) )
2
>> >
2.生成器
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
以下实例使用 yield 实现斐波那契数列:
import sys
def fibonacci ( n) : # 生成器函数 - 斐波那契
a, b, counter = 0 , 1 , 0
while True:
if ( counter > n) :
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci ( 10 ) # f 是一个迭代器,由生成器返回生成
while True:
try:
print ( next ( f) , end= " " )
except StopIteration:
sys. exit ( )
3.StopIteration
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 next () 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
class MyNumbers:
def __iter__ ( self) :
self. a = 1
return self
def __next__ ( self) :
if self. a <= 20 :
x = self. a
self. a += 1
return x
else :
raise StopIteration
myclass = MyNumbers ( )
myiter = iter ( myclass)
for x in myiter:
print ( x)
4.函数
(1)定义函数
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号 : 起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
实例1
def hello ( ) :
print ( "Hello World!" )
hello( )
实例2
def max ( a, b) :
if a > b:
return a
else :
return b
a = 4
b = 5
print ( max ( a, b) )
(2)参数传递
1)在 python 中,类型属于对象,对象有不同类型的区分,变量是没有类型的:
a= [ 1 , 2 , 3 ]
a= "Runoob"
以上代码中,[1,2,3] 是 List 类型,“Runoob” 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象。
2)可更改(mutable)与不可更改(immutable)对象
(3)参数
1)必须参数
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
调用 printme() 函数,你必须传入一个参数,不然会出现语法错误:
def printme ( str ) :
"打印任何传入的字符串"
print ( str )
return
printme( )
2)关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
以下实例在函数 printme() 调用时使用参数名:
def printinfo ( name, age ) :
"打印任何传入的字符串"
print ( "名字: " , name)
print ( "年龄: " , age)
return
printinfo( age= 50 , name= "runoob" )
3)默认参数
调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:
def printinfo ( name, age = 35 ) :
"打印任何传入的字符串"
print ( "名字: " , name)
print ( "年龄: " , age)
return
printinfo( age= 50 , name= "runoob" )
print ( "------------------------" )
printinfo( name= "runoob" )
4)不定长参数
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。
加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
def printinfo ( arg1, * vartuple ) :
"打印任何传入的参数"
print ( "输出: " )
print ( arg1)
print ( vartuple)
printinfo( 70 , 60 , 50 )
输出:
70
( 60 , 50 )
5)加了两个星号 ** 的参数会以字典的形式导入。
def printinfo ( arg1, ** vardict ) :
"打印任何传入的参数"
print ( "输出: " )
print ( arg1)
print ( vardict)
printinfo( 1 , a= 2 , b= 3 )
输出:
1
{ 'a' : 2 , 'b' : 3 }
6) 声明函数时,参数中星号 * 可以单独出现,如果单独出现星号 *,则星号 * 后的参数必须用关键字传入:
>> > def f ( a, b, * , c) :
. . . return a+ b+ c
. . .
>> > f( 1 , 2 , 3 )
Traceback ( most recent call last) :
File "<stdin>" , line 1 , in < module>
TypeError: f( ) takes 2 positional arguments but 3 were given
>> > f( 1 , 2 , c= 3 )
6
>> >
5.匿名函数
Python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
lambda 只是一个表达式,函数体比 def 简单很多。
lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
虽然 lambda 函数看起来只能写一行,却不等同于 C 或 C++ 的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
(1)语法
lambda [ arg1 [ , arg2, . . . . . argn] ] : expression
实例1
x = lambda a : a + 10
print ( x( 5 ) )
15
实例2
sum = lambda arg1, arg2: arg1 + arg2
print ( "相加后的值为 : " , sum ( 10 , 20 ) )
print ( "相加后的值为 : " , sum ( 20 , 20 ) )
相加后的值为 : 30
相加后的值为 : 40
6.return
return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的 return 语句返回 None。之前的例子都没有示范如何返回数值,以下实例演示了 return 语句的用法:
def sum ( arg1, arg2 ) :
total = arg1 + arg2
print ( "函数内 : " , total)
return total
total = sum ( 10 , 20 )
print ( "函数外 : " , total)
函数内 : 30
函数外 : 30
7.强制位置参数
Python3.8 新增了一个函数形参语法 / 用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式。
在以下的例子中,形参 a 和 b 必须使用指定位置参数,c 或 d 可以是位置形参或关键字形参,而 e 和 f 要求为关键字形参:
def f ( a, b, / , c, d, * , e, f) :
print ( a, b, c, d, e, f)
以下使用方法是正确的:
f( 10 , 20 , 30 , d= 40 , e= 50 , f= 60 )