函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段
语法:
def 函数名(参数列表):
函数体
return XXX
1. 函数的定义:
[python] view plain copy
def func_name(参数1,2...):
"函数底下第一行写一个str会作为函数的文档DocStrings"
print("hello world!")
print("hello again!")
函数底下缩进一个TAB的都是函数的代码块
按照语法就定义了一个函数,函数名为 func_name。
调用时输入: func_name(需要输入的参数) 进行调用。
使用: func_name.__doc__ 即可调用函数的DocStrings,一般用作为阐述函数的功能。
2. 函数的参数传递:
参数传递有两种方式:一是值传递,将参数复制一份副本(堆和栈中都复制)传入函数内,函数内部修改的数据
实际上是复制的副本,原参数不会受到影响;
[python] view plain copy
a = [1,2,3]
def foo(x):
x[1] = 10
foo(a) 调用函数
print(a) >> [1,2,3] 仍为原值
另一种是 引用传递 , 将参数本身传入函数中进行数据操作,只适用于 list,dict等可变量。值得注意的是,要使用引用传递,
必须要在参数中把可变量的值写进去,如果只是传入一个变量,则还是值传递:
[python] view plain copy
def foo(x):
x.pop()
return x
引用传递
print(foo([1,2,3])) >> [1,2]
值传递
l = [1,2,3]
foo(l)
print(l) >> [1,2,3] 仍为原值
3. 函数的几种参数
函数有 5 种参数,必选参数,默认参数,可变参数,关键字参数,命名关键字参数。
必选参数,就是普通的参数。
默认参数,调用时可省略,会有一个默认值。语法是加个 = x
[python] view plain copy
def foo(a,b=2,c=3):
pass
b,c 是默认参数
可变参数,可传入任意个参数,自动组成一个 tuple。语法是 *参数,也可直接调用时 *list
[python] view plain copy
def foo(*sdf):
pass
foo(1,2,3,3,4,4,2,32) 组成元组传入函数内
l = [1,2,3,4]
foo(*l) 将list每个值取出,组成元组。
关键字参数,**kw(固定语法) 可传入 任意个 等号键值对(a=2,键不需要引号) 的参数,组成一个字典传入函数,类似,
可以调用时 **dict 传入字典内所有内容。
[python] view plain copy
def foo(**kw):
pass
foo(name="sd",age=18)
d = {"name":"dsf","age":20}
foo(**d)
命名关键字,foo(a,b,*,name,age) 用一个星号,星号后面的都是命名关键字参数。仍然可以输入任意的 等号键值对 ,
相当于从中筛选出 name, age 两个键值对,没什么用。同时定义时,星号后的可以写成默认参数。
[python] view plain copy
def foo(a,b,*,name="pop",age=20):
pass
foo(a,b) 默认值补上
foo(a,b,name="sdf",class="ed",age=30)
class 被忽略
5. 全局变量
在外部创建的变量为全局变量,作用域为全部。函数内部定义的变量为局部变量,作用域仅限于函数内。如果想在函数内
使用全局变量,直接使用,但是不能赋值,由于python的创建变量机制,解释器会认为是在函数内创建一个新的变量。
解决方法 global 变量名,声明使用的是全局变量。建议定义全局变量写 g_变量名。
[python] view plain copy
a = 21
def foo():
global a
a = 30
print(a) >> 30
6. 匿名函数
适用于简单的函数(只有一行表达式的函数),用完就删。
[python] view plain copy
lambda x,y:x+y
冒号前为参数,冒号后为返回值
lambda是固定语法