1.创建函数
以'def'关键字开始,后边是函数名称,圆括号内是参数,后跟冒号,return返回,不写ruturn返回 None。
def Greet(name): print("Hello "+name) Greet("Python") 输出: Hello Python
1.1 一些重要的函数属性
def Greet(name): "Greet说明:文档化函数" print("Hello "+name+" ") Greet("Python") print(Greet.__doc__)#返回函数的文档字符串 print(Greet.__name__)#返回函数名字 print(Greet.__module__)#返回函数定义所在模块的名字 输出: Hello Python Greet说明:文档化函数 Greet __main__
1.2 参数
1.2.1 关键字参数和默认值
#使用关键字参数可以忽略参数顺序 #位置参数可以和关键字参数联合使用,但是位置参数必须放在关键字参数前面。 def hello(gretting,name,pun="!"): print("%s ,%s%s" % (gretting,name,pun)) hello("Hello","Bob") hello(name = "world",gretting = "Hello")#关键字 hello("Hello","Bob",pun=".") 输出: Hello ,Bob! Hello ,world! Hello ,Bob.
1.2.2 收集参数
def func3(title,*params): print(title) print(params) func3("title","Testing","Testing2","Testing3") 输出: title ('Testing', 'Testing2', 'Testing3') #可以看到参数前的星号将所有值放在同一个元组中,星号的意思就是收集其余位置的参数,如果不提供,就是个空元组。 # "**"处理关键字参数 返回字典 def print_params(**params): print(params) print_params(x=1,y=2,z=3) 输出: {'x': 1, 'z': 3, 'y': 2} 联合使用示例: # "**"处理关键字参数 def print_params(param1,param2,param3=7,*params4,**params5): print(param1,param2,param3) print(params4) print(params5) print_params("pa1","pa2","pa3","pa4","pa5","pa6",name="Bob",age=18,sex="男") 输出: pa1 pa2 pa3 ('pa4', 'pa5', 'pa6') {'sex': '男', 'name': 'Bob', 'age': 18}
1.2.3 收集参数的逆过程
def add(x,y): return x+y params=(1,2) print(add(*params)) 输出 3 def printUserInfo(**params): print(params) params2 = {"name":"bob","age":20,"sex":"男"} printUserInfo(**params2) 输出: {'sex': '男', 'name': 'bob', 'age': 20}
2.作用域
x=1#全局变量 def func():#每个函数调用都会创建一个新的作用域 x=3 func()#不会影响全局变量,全局变量名做参数名也没有问题 print(x) 输出: 1
如果局部变量或者参数的名字和想要访问的全局变量名相同,全局变量会被局部变量屏蔽,如果需要访问使用globals()["变量名"]获取
par = "thon" def combie(par): print(par+globals()["par"]) combie("py") 输出: python
重绑定全局变量
x=1 def change(): global x x=x+1 change() print(x) 输出: 2
3.其他
嵌套作用域,Python的函数是可以嵌套的
def foo(): def bar(): print("Hello") bar()
闭包
#闭包包含自由(未绑定到特定对象)变量;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。(引用百度百科) def foo(fac): def bar(num): return num*fac return bar double = foo(2) print(double(3)) tri = foo(5) print(tri(6)) print(foo(7)(8)) 输出: 6 30 56
递归
#阶乘 def factorial(n): if n == 1: return 1 else: return n * factorial(n-1) print(factorial(5)) 输出: 120 #幂 def power(x,n): if n == 0: return 1 else: return x * power(x,n-1) print(power(2,3)) 输出: 8
lambda表达式(匿名函数)
#Python对匿名函数的支持有限,只有一些简单的情况下可以使用匿名函数。 sum = lambda x, y : x + y """ 相当于: def f(x,y): return x + y """ print(sum(2, 3)) 输出 5