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表示。

posted @ 2020-12-17 21:32  rain小白菜  阅读(1025)  评论(0)    收藏  举报