初学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()函数内的内容。

  

时间: 2024-08-26 02:34:00

初学Python(四)的相关文章

初学 Python(十四)——生成器

初学 Python(十四)--生成器 初学 Python,主要整理一些学习到的知识点,这次是生成器. # -*- coding:utf-8 -*- ''''' 生成式的作用: 减少内存占有,不用一次性 创建list中所有的元素,而 是在需要的时候创建 ''' #创建generator有2种方式 #第一种将列表表达式中的[]改为()即可 g = (x*x for x in range(10)) print g for n in g: print n #第二种,关键字yield def fab(ma

初学Python(四)——set

初学Python(四)——set 初学Python,主要整理一些学习到的知识点,这次是set. # -*- coding:utf-8 -*- #先来看数组和set的差别 d=[1,1,2,3,4,5] s = set([1,1,2,3,4,5]) print d print s ''''' 打印出来的效果看出,多了一个set()后, list就变成了不能存储重复数据的类型了, 这叫set,不是list. ''' #添加元素 s.add(6) print s #删除元素 s.remove(6) p

初学Python,版本如何选择?

早在四年多以前,在我进入英才网之前,去面试过一家海归创业的公司.他们需要的是有unix开发经验的技术人员,但是因为他们当时所处的阶段对很多成熟 技术人员不是很吸引,所以条件放宽为熟悉面向对象的程序开发即可考虑.我当时草草看过过一遍C#的语法,当时的水平对一门新语言的掌握速度远不如现在,因 此也仅学到点皮毛,对于很多概念都不了解,比如重载和重写就不知道.我第一次听说Python这个语言,就是在那次面试. 当时面试官在了解了我的情况之后,问我都掌握一些什么语言.我说我会什么什么(在这里不好意思列举)

初学 Python(十一)——切片

初学 Python(十一)--切片 初学 Python,主要整理一些学习到的知识点,这次是切片. #-*- coding:utf-8 -*- ''''' 切片 ''' L = ['name','age','sex','address','company'] #取前2个 print L[0:2] print L[:2] #取倒数第一个 print L[-1] #取后两个 print L[-2:] #取倒数第二个 print L[-2:-1] print len(L) #隔一个数取一次,从第一个数开

初学 Python(十三)——匿名函数

初学 Python,主要整理一些学习到的知识点,这次是匿名函数. # -*- coding:utf-8 -*- #关键字lambda定义的函数都是匿名函数 #做对象 f = lambda x,y:x+y print f(1,2) #做参 print reduce(lambda x,y:x+y,[1,2,3,4,5,6]) #做返回值 def build(x,y): return lambda:x*x+y*y g = build(1,2) print g print g()

初学Python

初学Python 1.Python初识 life is short you need python--龟叔名言 Python是一种简洁优美语法接近自然语言的一种全栈开发语言,由"龟叔"编写开发一种易学易懂高效的语言. Python提供丰富的接口和模块,便于使用其他语言细化,性能提升对要求较高的软件. 以上简单描述了一下Python语言的优点,缺点我就不写了,因为不需要对比,强大的语言自会解决现在几个劣势. 针对于初学者版本选择的问题,因为现在国内大多数在使用2.X版本,个人建议使用3.

【初学python】错误SSLError: [Errno 1] _ssl.c:504:的解决记录

最近在实习公司学习使用python做web自动化测试,其中使用到httplib这个模板,主要用于与待测试界面建立HTTP连接,发送数据请求,接收请求状态码和查询数据,验证功能.但是新版本的web界面改成使用https协议,原来的测试用例都变成无法跑通的状态. 将协议从HTTP改成HTTPS后,报以下错误: SSLError: [Errno 1] _ssl.c:504: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown proto

初学Python(九)——函数

初学Python(九)--函数 初学Python,主要整理一些学习到的知识点,这次是函数. 函数定义: # -*- coding:utf-8 -*- #函数的定义 def my_function(x): if x>0: return x elif x<0: return -x else: pass #函数的调用 a = my_function(-1) b = my_function(2) c = my_function(0) print a,b,c #空函数,pass为占位符 def empt

初学 Python(十二)——高阶函数

初学 Python(十二)--高阶函数 初学 Python,主要整理一些学习到的知识点,这次是高阶函数. #-*- coding:utf-8 -*- ''''' 话说高阶函数: 能用函数作为参数的函数 称为高阶函数 ''' #函数作参 def f(x): return x*x #map函数为内置函数,意思为将第二个参数的list作用到f函数中 #最后的结果为一个list print map(f,[1,2,3,4,5]) #reduce函数为内置函数,意思将第二参数的序列作用到add函数值 #将结

初学Python(八)——迭代

初学Python(八)——迭代 初学Python,主要整理一些学习到的知识点,这次是迭代. # -*- coding:utf-8 -*- from collections import Iterable ''''' 迭代 ''' L = ['af','st','at','psst','beta'] D = {1:'af',2:'st',3:'at',4:'psst',5:'beta'} S = 'helloworld' #数组 for item in L: print item #字典 for