函数
函数的作用:
结构化编程对代码的最基本的封装,一般按照功能组织一段代码。
封装的目的为了复用,减少余代码。、
代码更加简洁美观,可读易懂。
函数分类
内建函数:max(),reversed()等。
库函数:math.celi()等。
函数定义,调用
def语句定义函数:
def 函数名(参数列表):
函数体(代码块)
[return 返回值]
函数名就是标识符,命名要求一样
语句块必须缩进,约定4个空格。
python的函数没有return语句,隐式会返回一个none值。
定义中的参数列表成为形式参数,只是一种符号表达,简称形参。
调用
函数定义,只是声明一个函数,他不会被执行,需要调用。
调用的方式,就是函数名加上小括号,括号内写上参数。
调用时写的参数是实际参数,是实实在在传入的值,简称实参。
参数传递
在python中,类型属于对象,变量是没有类型的:
a = [1.2.3] a = 'Runoob'
上例中,[1,2,3]是list类型‘Runoob’是string类型,而变量a是没有类型,它仅仅是一个对象大的引用,是一个指向list类型对象,也可以是指向string类型对象。
不可更改和可更改对象
string,tuples,numbers是不可更改对象,list,dict是可以修改对象。
不可变类型:变量赋值a=5后再赋值a=10,这里实际是新生成一个int值对象10,在让a指向它,而5被丢弃,不是改变a的值,相当于新生成了a.
可变类型:变量赋值 lan=[1,2,3,4]后再赋值la[2]=5则是将list la的第三个元素值更改,它本身没有动,只是内部一部分值被修改。
参数
必须参数,关键字参数,默认参数,不定长参数
必须参数:要以正确的顺序传入函数。调用时的数量必须和声明式的一样。调用printme()函数,必须传入一个参数。
关键字参数:关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
#可写函数说明 def printinfo( name, age = 35 ): "打印任何传入的字符串" print ("名字: ", name) print ("年龄: ", age) return #调用printinfo函数 printinfo( age=50, name="runoob" ) print ("------------------------") printinfo( name="runoob" )
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。基本语法如下:
def functionname([formal_args,] *var_args_tuple ): "函数_文档字符串" function_suite return [expression]
加了星号(*)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量。如下实例:
#!/usr/bin/python3 # 可写函数说明 def printinfo( arg1, *vartuple ): "打印任何传入的参数" print ("输出: ") print (arg1) for var in vartuple: print (var) return # 调用printinfo 函数 printinfo( 10 ) printinfo( 70, 60, 50 )
以上实例输出结果:
输出: 10 输出: 70 60 50
声明函数时,参数中星号(*)可以单独出现,例如:
def f(a,b,*,c): return a+b+c
用法:星号(*)后的参数必须用关键字传入。
>>> 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 >>>
全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问,调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。
当局部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字进行修改。