一、自定义函数
Python中自定义函数的规则:
- 函数代码块以def开头,后接函数名和():;
- 任何传入参数和自变量必须放在小括号中;
- 函数的第一行语句可以选择性地使用文档字符串——用于存放函数说明。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
示例:
def 函数名(参数列表):
函数体
二、调用函数
定义了函数之后,就相当于有了一个具有某些功能的代码,想要让这些代码能够执行,需要调用它,调用函数很简单的,通过 函数名() 即可完成调用。
def printString():
print("人生苦短,我用Python")
#调用函数
printString()
三、参数传递
3.1、可更改(mutable)与不可更改(immutable)对象
在python中,string、tuple和numbers都是不可变类型,list和dict是可变类型。
- 不可变类型:a=5,再次赋值a=10,实际上是重新生成了一个int类型的对象10,并将a指向10,原先的5将被舍弃。
- 可变类型:list=[1,2,3,4,5],list[2]=333,这里将list的第三个元素3改为了333,list的指向没有改变,只是它的内部改变了。
在python的参数传递中:
- 传递不可变类型:仅仅是传递了值,对原对象没有影响。
- 传递可变类型:传递的是实实切切的原对象,函数对参数的修改会影响原对象。
#传递不可变类型
def change(a):
a=100
b=0
change(b)
print(b)#输出结果仍然是0,没有改变
#传递可变类型
def change(list):
list[0]=list[0]+100
list=[1,2,3,4,5]
change(list)
print(list)#list被改变:[101,2,3,4,5]
3.2、参数类型
以下是调用函数时可使用的正式参数类型:
- 必需参数
- 关键字参数
- 默认参数
- 不定长参数
必需参数:
传递参数时必须与参数的顺序一致,并且传递的数量也要一致。
def printString(str):
print(str)
#调用有参函数但不传递参数
printString()
def add(a,b):
print(a+b)
#传递参数数量不一致
add(1,2,3)
关键字参数:
在必需参数中我们的传递参数要和函数参数的顺序一致,使用关键字参数我们可以做到顺序不一致依旧可以调用,python会自动匹配:
def printValue(str,num):
print("字符串为:",str)
print("数字为:",num)
print("Hello Python",100)
#使用关键字参数可以顺序不一致
print(num=100,str="Hello Python")
默认参数:
当我们没有传递参数时我们可以使用参数的默认参数。
def add(a,b=100):
print(a+b)
#只传递一个参数
add(100)#打印结果200
注意:默认参数的设置只能由右至左进行设置否则无法使用。
不定长参数:
当我们不确定函数该传递多少个参数时我们可以使用不定长参数:
#args本质上是一个元组
def sumFun(n,*args):
sum=0
sum=sum+n
for num in args:
sum = sum+num
return sum
print(sumFun(1))
print(sumFun(1,2,3,4,5,6,7,8,9,10))
四、匿名函数
python 使用 lambda 来创建匿名函数。
lambda 函数的语法只包含一个语句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
第一个匿名函数:
sum = lambda arg1, arg2: arg1 + arg2;
print(sum(12,23))#输出结果35
使用匿名函数我们可以动态的改变函数的功能:
fun1=lambda x,y:x+y
fun2=lambda x,y:x*y
def test(x,y,func):
return func(x,y)
print("加法:",test(22,22,fun1))
print("乘法:",test(22,22,fun2))
动态输入lambda表达式实现动态使用函数:
def test(x,y,fun):
return fun(x,y)
fun=input("输入你想使用的操作:")
fun=eval(fun)#把字符串转换成可以执行的表达式,必须进行转换
test(22,22,fun)
使用匿名函数实现列表的排序:
#列表的每个元素都是字典类型
list=[{'name':'Jake','age':50},{'name':'Amni','age':10},{'name':'Zoo','age':20},{'name':'Bob','age':35}]
#list.sort()是无法实现排序操作的,因为不知道对name还是age进行排序
#这时我们可以使用匿名函数来实现排序
list.sort(key = lambda x:x['age'])#根据age排序
print(list)
五、变量作用域
程序中变量并不是所有地方都是可以访问到的,能否访问到此变量需要考虑此变量在哪里。
Python的作用域一共有4种,分别是:
- L (Local) 局部作用域
- E (Enclosing) 闭包函数外的函数中
- G (Global) 全局作用域
- B (Built-in) 内建作用域
在访问变量时以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包(后续介绍)),再找不到就会去全局找,再者去内建中找。
Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问。
while(True):
str="hello python"
#在while代码块外我们依旧可以访问str这一变量
str="Hello JAVA"
六、全局变量和局部变量
局部变量只能在程序特定过程或函数中可以访问。全局变量可以在整个程序中访问。
判断全局变量和局部变量:
sum=0 #这是全局变量
def add(x,y):
sum=x+y #这是局部变量
return sum
print(add(1,1))
#输出2
print(sum)
#仍然输出0
我们想通过函数修改全局变量sum的值,因为它是个不可变对象所有通过函数的传参是无法实现的,我们需要使用global关键字:
sum=0
def add(x,y):
global sum
sum=x+y
return sum
print(add(1,1))
#输出2
print(sum)
#输出2,修改成功