迭代器python菜鸟_Python菜鸟(四)

Python初学者(四)

十一、函数

Python中函数以def定义,用于实现某种功能,若是某段代码被多处使用,不妨将它定义成一个函数,或是它用于实现特定的功能,也可以将它定义成一个函数;

一个函数func(),func为函数名,是这个函数引用(指向函数的地址);而加上括号func()则表示执行这个函数;

在函数中定义的变量为局部变量,在函数体为不可引用它(在for循环中定义的变量,for循环体之外可引用);

函数的动态参数func(*args1, **args2),*args1会将传进来的参数以元组的形式存在args1中,**args2会将以特定形式传进来的参数以字典的形式存在args2中,例如:func(a, b, c, name = 'Jom', age = '17'),其中a、b、c为变量,name和age为key,等号后面的作为value;

在文件中函数不会被运行,Python只是去加载它,除非它被引用执行;Python文件有一个系统变量为“__name__”,默认值为当前文件名,但是被执行的文件默认值为“__main__”,所以可以使用"if '__name' == '__main__':"作为文件的执行入口;

若是这个函数没有使用return指定这个函数的返回值,那么这个函数的返回值默认为None。

>>> def func(*args1, **args2): # 动态参数指不用指定参数参数个数和各个参数的形参名

print(args1)

print(args2)

print(args1[2])

print(args2['name'])

>>> func

>>> result = func(1, 2, 3, name = 'Jom', age = '17')

(1, 2, 3)

{'age': '17', 'name': 'Jom'}

3

Jom

>>> print(result) # 没有使用return指定返回值

None

十二、迭代器与生成器

迭代器:

迭代器用于访问集合中的元素,使用迭代器不需要提前准备好要迭代的所有元素,只有迭代到某个元素时才会计算该元素,这个元素之前或之后都是没有的,因为迭代器这个特点,它遍历集合元素占用的内存很少,适用于访问一些特别大的甚至是无限的集合;

迭代器迭代元素时使用__next__()方法不断地去访问下一个元素,只能“前进”,不能“后退”,也不能通过下标等去访问某个特定的元素;

当访问完集合后,这个迭代器就“完了”,要想再遍历这个集合,就要新建一个迭代器了。

生成器:

如果一个函数被调用时返回了一个迭代器,那么这个函数就叫做生成器;如果一个函数中含有yield语法,那么这个函数也是生成器;

yield语法的特点:当含有yield语法的函数被调用后,执行yield后,就会中断这个函数,继续执行这个函数之后的代码,当下一次这个函数再被调用时,会从这个函数的上次执行的yield之后的代码开始执行。

>>> defgenerator():

n= 3

while n >0:yield 'hello python!' #含有yield,这个函数即为生成器,每次生成一个字符串“hello python!”

n -= 1

>>> iterator =generator() # 返回一个迭代器>>> iterator.__next__()'hello python!'

>>> iterator.__next__()'hello python!'

>>> iterator.__next__()'hello python!'

>>> iterator.__next__() # 访问完后就“没有了”,这个迭代器也不能再用了

Traceback (most recent call last):

File"", line 1, in iterator.__next__()

StopIteration>>>

十三、装饰器

装饰器的作用就是为已存在的对象添加额外的功能,特点在于不用改变原先的代码即可扩展功能;

一个对象可以被多个装饰器装饰,装饰器也可以带参数装饰(如下例中可以这样@decorator(func1, func2),当然参数也是函数名,而hello就会被作为装饰器返回值所代表的函数(inner())的参数了,不再直接是decorator()的参数了(decorator()的参数已被func1和func2占用了)),这里就只展示装饰器基本原理和流程。

defdecorator(func):print('hello python!')definner(name):print('hello, my friend')

func(name) # func即为hello()函数returninner

@decorator # 装饰器用@表示,函数decorator()装饰函数hello()defhello(name):print('hello %s!' %name)

hello('Jom') # 执行函数--------------------------------------------------------------hello python!

hello, my friend

hello Jom!

在加载装饰器时,也就是加载到@符时,会运行一次装饰器(也就是被@修饰的函数),它的返回值会替代被修饰的函数地址,而被修饰的函数的地址以装饰器函数参数的形式传进了装饰器。示例中:加载到@decorator时,运行了一次decorator()函数,这时函数hello()把函数名(也就是函数地址hello)作为装饰器参数func传了进去,decorator()执行完后返回函数inner()的函数地址(这个函数地址替代了函数hello()的函数地址),执行hello('Jom')时,就会执行替换后的函数,即inner('Jom'),然后就会去执行inner()函数内的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值