第五章 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。也是带名字的代码块。

Python函数有两部分:定义和调用。

函数定义

定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。在Python中定义函数即创建一个对象。

def func_name(param1, param2, ……): #def 关键字告诉Python创建一个函数对象

"""doc"""

python block

return expression

函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。函数内容以冒号起始,并且缩进。return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

函数对象也有方法和属性,使用func_name.的形式调用:

属性:

__name__ 函数名

__str__ 用于构造字符串函数

__dict__ 函数的命名空间

__doc__ 函数的文档字符串

函数调用

执行已经定义的函数,方式如下:

func_name(params)

参数

参数传递按引用传递,函数实参与形参调用指向的是同一对象,可以通过ID验证。

针对可变与不可变参数类型,在函数内部修改:

1、可变:直接操作实参

2、不可变:形参指向新的对象

参数类型有以下几种方式:

1、必备参数

需要在调用是指定的参数,函数调用指定参数可以有两种方式:

func_name("1", "2") #位置参数

func_name(param2="2", param1="1") #关键字参数

2、默认参数

在函数定义时,为一些参数指定默认值的行为。

def func_name(lev=1): #lev指定默认参数1

"""doc""" # 通过 func_name.__doc__ 查看

pass

3、不定长参数(位置&关键字)

A、任意实参

Python支持函数从调用语句中手机任意数量的实参。

定义:将参数以 * 修饰;*params #

调用:传递任意数量的实参

通过将N个实参封装到一个元组中,接收的参数通过*修饰形参为一个空元组。即使有一个元素也会元组形式封装。

def func_call(*params): # *让Python创建一个名为params的空元组

print params # (x, x, x, …)

func_call(1)

func_call(1, 2, 3)

B、任意关键字实参

Python也可以接收指定key=value形式的任意实参,通过字典实现。

定义:将参数以 ** 修饰;**params #

调用:传递任意数量的 key=value,key必须是合法的标识符

C、参数反解

a、实参元组到指定数量形参,*tuple 即可。

def params_func(a, b, c):

pass

param = ("1", "2", "3")

params_func(*param)

b、

返回值

return 退出函数,选择性地向调用方返回一个表达式。可以返回复杂的对象:列表,元组,字典等。

return不仅可以返回表达式还可以返回函数:

return func_name #返回函数对象

return func_name() #返回函数执行的结果

python支持以tuple的形式返回多个值,需要记录返回值顺序。默认多个参数的返回值以元组形式返回。

return a, b, c # (a, b, c)

有些函数没有 return 语句,这种函数称为过程。在这种情况下返回一个特殊的值None。

def no_return():

pass

print no_return() # None

匿名函数

Python 使用 lambda 来创建匿名函数。lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

sum = lambda num1, num2: num1 + num2

PEP 8 不建议创建匿名函数,建议用def替换。

Python 生成器(generator)

生成器就是一种迭代器。生成器拥有next方法并且行为与迭代器完全相同,生成器是可迭代的,这意味着生成器也可以用于Python的for循环中。生成器由函数演变而来,如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。

生成器的执行流程,函数是顺序执行,遇到return语句或者最后一条语句返回。而生成器是在调用next的时候执行,遇到yield语句停止,再次next时从上次yield的语句处继续执行。每次next返回值为 yield 修饰的变量。

  • 定义

方式一:由函数演变而来

def numbers():

for num in range(1, 1000):

yield num # 每次调用 next() 的返回结果

方式二:由列表推导而来

nums = (num fpr num in range(1, 1000))

  • 调用

调用方式与函数不同,需要一个变量接收生成器,并且调用next进入执行流程,停止在 yield 语句处。

nums = numbers()

print nums #

print type(nums) #

nums.next() # 返回当前 yield 指向的值

pass介绍

Python pass是空语句,是为了保持程序结构的完整性。 pass 不做任何事情,一般用做占位语句。

当因为语法需要但不希望执行任何命令或代码时,则可以使用pass语句。

Python内置函数

1、range(begin, end, step),生成指定范围的数字列表,左闭右开

2、zip([iterable, ...])

接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。

利用*号操作符,可以将list unzip(解压)。

a = [1, 2, 3]

b = ['a', 'b', 'c']

ab = zip(a, b) # [(1,'a'), (2, 'b'), (3, 'c')]

unab = zip(*ab) # [(1, 2, 3), ('a', 'b', 'c')]

3、eval()

原型:eval(expression[, globals[, locals]])

执行一个字符串表达式,并返回其值。可以将字符串执行进行表达式计算,list,dict转换。


分享到:


相關文章: