设为首页 加入收藏

TOP

Python初学者(四)
2017-09-30 17:41:15 】 浏览:8869
Tags: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
<function func at 0x0000000003450598>
>>> 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之后的代码开始执行。

>>> def generator():
    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 "<pyshell#13>", line 1, in <module>
    iterator.__next__()
StopIteration
>>> 

十三、装饰器


 

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

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

def decorator(func):
    print('hello python!')
    def inner(name):
        print('hello, my friend')
        func(name) # func即为hello()函数 return inner

@decorator # 装饰器用@表示,函数decorator()装饰函数hello() def hello(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()函数内的内容。

  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇supervisord安装使用简记 下一篇豆瓣影评数据抓取与简要分析

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目