python从0到1--9 函数
1.函数的创建和调用
1.1创建一个函数
创建函数也称为定义函数,可以理解为创建一个具有某种用途的工具。使用def关键字实现。格式如下:
def functionname([parameterlist]):
['''comments''']
[functionbody]
参数说明:
functionname:函数名称,在调用函数时使用
parameterlist:可选参数,用于指定向函数中传递的参数。如果有多个参数,各参数间使用逗号分隔。如果不指定,则表示该函数没有参数。在调用时,也不指定参数
comments:可选参数,表示为函数指定注释,注释内容通常是说明该函数的功能,要传递的参数的作用等,可以为用户提供友好和帮助的内容
functionbody:可选参数,用于指定函数体,即该函数被调用后,要执行的功能代码。如果函数有返回值,可以使用return语句返回
例如:定义一个根据身高,体重计算BMI指数的函数fun_bmi(),该函数包括3个参数,分别用于指定姓名/身高/体重,在根据公式:BMI=体重/(身高*身高)计算BMI指数,并输出结果。
def fun_bmi(person,height,weight): '''功能:根据身高体重计算BMI指数 person:姓名 height:身高,单位:米 weight:体重,单位:千克 ''' print(person + "的身高:" + str(height) +"米 \t体重:"+ str(weight)+"千克") bmi = weight/(height*height) print(person+"的BMI指数为:"+str(bmi)) if bmi < 18.5: print("您的体重过轻") if bmi >=18.5 and bmi < 24.9: print("正常范围") if bmi > 24.9: print("您的体重超重") if bmi >= 29.9: print("肥胖")
1.2 调用函数
调用函数其实也就是执行函数。语法格式:
functionname([parametersvalue])
参数说明:
functionname:函数名称,要调用的函数名称,必须是已经创建好的
parametersvalue:可选参数,用于指定各个参数的值,如果需要传递过个参数值,用逗号分隔;如果没有函数则直接写一对小括号。
例如:上面的代码,实现调用函数,计算rain的BMI指数;
def fun_bmi(person,height,weight): '''功能:根据身高体重计算BMI指数 person:姓名 height:身高,单位:米 weight:体重,单位:千克 ''' print(person + "的身高:" + str(height) +"米 \t体重:"+ str(weight)+"千克") bmi = weight/(height*height) print(person+"的BMI指数为:"+str(bmi)) if bmi < 18.5: print("您的体重过轻") if bmi >=18.5 and bmi < 24.9: print("正常范围") if bmi > 24.9: print("您的体重超重") if bmi >= 29.9: print("肥胖") fun_bmi("rain",1.65,70)
运行结果:
rain的身高:1.65米 体重:70千克 rain的BMI指数为:25.71166207529844 您的体重超重
1.3 pass语句
在python中有个pass语句,表示空语句,它不做任何事情,一般起到占位作用,例如,创建一个函数,但我们暂时不知道这个函数干嘛的。这是用pass语句填充函数主体。
def func(): pass
2.参数传递
2.1形式参数和实际参数
形式参数:在定义函数时,函数名后面括号中的参数为“形式参数”,也称行参。
实际参数:在调用一个函数时,函数名后米娜括号中的参数为“实际参数”。也就是将参数的调用者提供给函数的参数称为实际参数,也称实参
举个例子:假如说,我们要在一张纸上用笔画画。那么笔就是“形式参数”;如果我选择用铅笔来实现画画,那么铅笔就是“实际参数”。
其中:当实参为不可变对象时,进行的值传递;当实参为可变对象时,进行的时引用对象。
例如:
#定义函数 def demo(obj): #obj形式参数 print("原值:",obj) obj += obj #调用函数 print("="*10 + "值传递" + "="*10) mot = "我爱洗澡,皮肤好好" #采用不可变对象--字符串(实参) print("调用函数前:",mot) demo(mot) print("调用函数后:",mot) print("="*10 + "引用传递" + "="*10) list1 = ["Kobe","James","Lrving","Harden"] #采用可变对象--列表(实参) print("调用函数前:",list1) demo(list1) print("调用函数后:",list1)
运行结果:
==========值传递========== 调用函数前: 我爱洗澡,皮肤好好 原值: 我爱洗澡,皮肤好好 调用函数后: 我爱洗澡,皮肤好好 ==========引用传递========== 调用函数前: ['Kobe', 'James', 'Lrving', 'Harden'] 原值: ['Kobe', 'James', 'Lrving', 'Harden'] 调用函数后: ['Kobe', 'James', 'Lrving', 'Harden', 'Kobe', 'James', 'Lrving', 'Harden']
2.2 位置参数
位置参数也称为必备参数,必须按照正确的顺序传到函数中。即调用的函数数量和位置必须和定义的是一样的。
例如:
def fun_hello(name, sex): sex_dict = {1: '先生', 2: '女士'} print('hello %s %s, welcome to python world!' %(name, sex_dict.get(sex))) # 两个参数的顺序必须一一对应,且少一个参数都不可以 fun_hello('张建宇',1)
运行结果:
hello 张建宇 先生, welcome to python world!
2.3 关键字参数
关键字参数是指使用行参的名字来确定输入的参数值。通过该方式指定的实参时,不再需要与行参的位置完全一致,只要将参数名写正确即可
同样上面的例子:
def fun_hello(name, sex): sex_dict = {1: '先生', 2: '女士'} print('hello %s %s, welcome to python world!' %(name, sex_dict.get(sex))) # 在利用关键字参数时,可以不按顺序位置 fun_hello(sex = 2,name= "赛金花")
2.4为参数设置默认值
在调用函数时,如果没有指定某个参数将抛出异常,那么我们可以在定义函数时,直接指定形式参数的默认值。这样,当没有传入参数时,直接使用定义函数时的这个默认值
例如:
def fun_bmi(height,weight,person = "wind"): '''功能:根据身高体重计算BMI指数 person:姓名 height:身高,单位:米 weight:体重,单位:千克 ''' print(person + "的身高:" + str(height) +"米 \t体重:"+ str(weight)+"千克") bmi = weight/(height*height) print(person+"的BMI指数为:"+str(bmi)) if bmi < 18.5: print("您的体重过轻") if bmi >=18.5 and bmi < 24.9: print("正常范围") if bmi > 24.9: print("您的体重超重") if bmi >= 29.9: print("肥胖") fun_bmi(1.65,70,"cloud") fun_bmi(1.90,80)
注意:在定义函数时,指定默认的行参必须在所有参数最后.
在定义函数时,为形式参数设置默认值要牢记一点:默认参数必须指向不可变对象。
2.5可变参数
可变参数也称为不定长参数,即传入函数中的实际参数可以是0个,1个,2个。。。。。n个。
定义可变参数主要是两种形式,一种是*parameter,另一种是**parameter。
2.5.1 *parameter
这种形式表示接收任意多个实际参数并将其放到一个元组中。
例如:
def player(*name): print("\n我喜欢的NBA球员有: ") for i in name: print(i) player("Kobe") player("Kobe","Yaoming","Harden") player("Kobe","Park","Bob","James")
如果想要使用一个已经存在的列表作为函数的可变参数,可以在列表的名称前加*。例如
listname = ["Kobe","Park","Bob","James"] player(*listname)
2.5.2 **parameter
这种形式表示接收任意多个显式赋值的实际参数,并将其放到一个字典中。
例如:
def printsign(**sign): print() for key,value in sign.items(): print(key + "的绰号是: " + value) printsign(邓肯 = "石佛",罗宾逊="海军上将") printsign(吉诺比利 = "妖刀",帕克 = "法国跑车",科比 = "黑曼巴")
如果想要使用一个已经存在的字典作为函数的可变参数,可以在字典名称前加“**”
例如:
dict1 = {"邓肯":"石佛","罗宾逊":"海军上将","科比":"黑曼巴"}
printsign(**dict1)
3.返回值
我们在定义函数的时候,其实是告诉他实现什么功能或运算。但是函数并不知道你想要的成品是什么。那么return就是来实现这一目标。(老板--工人--材料--成品)
例如:
#商城促销活动,满500打9折。满1000打8折。满2000打7折。满3000打6折 def fun_chekout(money): money_old = sum(money) money_new = money_old if 500 <= money_old <1000: money_new = '{:.2f}'.format(money_old*0.9) elif 1000<= money_old <2000: money_new = '{:.2f}'.format(money_old * 0.8) elif 2000<=money_old<3000: money_new = '{:.2f}'.format(money_old * 0.7) elif money_old>3000: money_new = '{:.2f}'.format(money_old * 0.6) else: money_new == money_old return money_old,money_new list_money = [] while True: inmoney = float(input("请输入商品金额(输入0表示输入完毕):")) if int(inmoney) == 0: break else: list_money.append(inmoney) money = fun_chekout(list_money) print("合计金额:",money[0],"应付金额:",money[1])
4.变量
变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,再访问就会出现错误。
4.1局部变量
局部变量是指函数内部定义并使用的变量,它只在函数内部有效。
例如:
def fun_demo(): message = "hello python" print("局部变量在函数体内",message) fun_demo() print("局部变量在函数体外",message)
上面这段代码,执行完成后,之后在函数内部的变量会成功,外部的变量会抛出异常
4.2全局变量
- 如果一变量,在函数外定义,那么不仅可以在函数外可以访问到,在该函数内也可以访问到。这个就称为全局变量
例如:
message = "hello python" def fun_demo(): print("函数体内",message) fun_demo() print("函数体外",message)
运行结果:
局部变量在函数体内 hello python
局部变量在函数体外 hello python
- 当局部变量与全局变量重命名时,对函数体对变量进行赋值后,不影响函数体外对变量。
例如:
message = "hello python" print("函数体外:",message) def fun_demo(): message = "hello china" print("函数体内: ",message) fun_demo() print("函数体外: ",message)
函数体外: hello python
函数体内: hello china
函数体外: hello python
- 在函数体内定义,并且使用global关键字修饰后,该变量也可以成为全局变量。在函数体外也可以访问到该变量,并且在函数体内还可以对其进行修改。
例如
message = "hello python" print("函数体外:",message) def fun_demo(): global message message = "hello china" print("函数体内: ",message) fun_demo() print("函数体外: ",message)
运行结果:
函数体外: hello python
函数体内: hello china
函数体外: hello china
5 匿名函数
匿名函数:指没有名字的函数,它主要应用在需要一个函数,但是又不想费神去命名这个函数。在python中使用lambda表达式创建匿名函数
例如:要定义一个计算圆面积的函数。常规代码如下:
import math def circlearea(r): result = math.pi*r*r return result r = 10 print("半径为",r,"的圆面积为:",circlearea(r))
使用lambda表达式的代码如下:
import math r = 10 result = lambda r:math.pi*r*r print("半径为",r,"的圆面积为:",result(r))
6.常用的python中内置函数

小测验:编写一个函数,实现中俄双方货币间的转换。(1人民币=9.912卢布;1卢布=0.1009人民币)。程序可以接受输入人民币或者卢布,转换成卢布或者人民币。人民币用RMB表示。卢布用RUB表示。

浙公网安备 33010602011771号