函数的基本知识

用贩卖机来打比方,贩卖机是设定好可以直接使用(组织好的),可以重复上架售卖不同的物品(重复使用),功能是卖东西(单一功能)。

定义和调用函数

def greet(name):
    print(name+'早上好')
    return

第1行:def的意思是定义(define),greet是【函数名】(自己取的),再搭配一个括号和冒号,括号里面的name是参数(参数名也是自己取)。
icon
第2行:def下一行开始缩进的代码是函数要实现的功能,也叫【函数体】。这里的函数体展现出的功能就是:打印出“name+ 早上好”这句话。
icon
第3行:一个简单的return。函数内部一旦遇到return语句,就会停止执行并返回结果。没有return语句的函数,Python也会在末尾隐性地加上return None,即返回None值(return None可以简写为return。)所以你也会看到,我们接下来的很多例子是省略了return语句的。

#函数名:最好是取体现函数功能的名字,一般用小写字母和单下划线、数字等组合
def greet(name):
#参数:根据函数功能,括号里可以有多个参数,也可以不带参数,命名规则与函数名相同
#规范:括号是英文括号,后面的冒号不能丢
    print(name+'早上好')
#函数体:函数体就是体现函数功能的语句,要缩进,一般是四个空格
    return 

调用函数

def pika2(name):
    print('我最喜爱的神奇宝贝是'+name)
pika2('皮卡丘')  #调用函数,输入函数名pika()并输入参数'皮卡丘'
pika2('喷火龙')  #调用函数,输入函数名pika()并输入参数'喷火龙

调用函数最关键的是:得弄清楚这个函数有多少个参数,如何给参数赋值,这个过程在函数里叫做参数的传递(pass)。

主要的参数类型有:位置参数、默认参数、不定长参数。

def  menu(appetizer,course):
    print('一份开胃菜:'+appetizer)
    print('一份主食:'+course)

menu('话梅花生','牛肉拉面')

这里的'话梅花生'和'牛肉拉面'是对应参数appetizer和course的位置顺序传递的,所以被叫作【位置参数】 ,这也是最常见的参数类型。

def  menu(appetizer,course):
    print('一份开胃菜:'+appetizer)
    print('一份主食:'+course+'\n')
#还记得转义字符\n吧,表示换行

menu('牛肉拉面','话梅花生')
menu('话梅花生','牛肉拉面')
#如果采用下面这种形式传递,就不需要理会参数位置
menu(course='牛肉拉面',appetizer='话梅花生')

def  menu(appetizer,course,dessert='绿豆沙'):
    print('一份开胃菜:'+appetizer)
    print('一份主食:'+course)
    print('一份甜品:'+dessert)

menu('话梅花生','牛肉拉面')
#因为已经默认将'绿豆沙'传递给dessert,调用时无须再传递。

def  menu(appetizer,course,dessert='绿豆沙'):
    print('一份开胃菜:'+appetizer)
    print('一份主食:'+course)
    print('一份甜品:'+dessert)

menu('话梅花生','牛肉拉面','银耳羹')
#银耳羹对应参数dessert

后来呢,盛夏来袭,你觉得卖烧烤是个不错的主意。但问题是每个人点的烤串数量都不同,你也不能限定死数量,这时候【不定长参数】就能派上用场,即不确定传递参数的数量。

它的格式比较特殊,是一个星号*加上参数名,来看下面的例子。

def menu(*barbeque):
    print(barbeque)
menu('烤鸡翅','烤茄子','烤玉米')
#这几个值都会传递给参数barbeque

你会发现输出的是这样的结果:('烤鸡翅', '烤茄子', '烤玉米'),这种数据类型叫做元组(tuple),曾在第4关的必做练习中与你打过照面。我们就趁势来复习一下:

元组的写法是把数据放在小括号()中,它的用法和列表用法类似,主要区别在于列表中的元素可以随时修改,但元组中的元素不可更改。

order=('烤鸡翅','烤茄子','烤玉米')
#元组的长度没有限制
def menu(*barbeque):
    print(barbeque)
menu(*order)

def menu(appetizer,course,*barbeque,dessert='绿豆沙'):
    print('一份开胃菜:'+appetizer)
    print('一份主菜:'+course)
    print('一份甜品:'+dessert)
    for i in barbeque:
        print('一份烤串:'+i)        
menu('话梅花生','牛肉拉面','烤鸡翅','烤茄子','烤玉米')

def chide(xiaocai,zhushi,tianpin='黑森林可乐',*shaokao):
    print('一盘小菜:'+xiaocai)
    print('主食来啦:'+zhushi)
    print('一份甜品:'+tianpin)
    for i in shaokao:
        print('烧烤之一:'+i)
chide('炒豆苗','馒头','樱桃布丁','羊肉串','肉筋','板筋','烤韭菜')

a=[1,2,3]
print(len(a))

当你把参数a放进len() 函数中,它返回来的是3这个数值(列表的长度)。像常见的type()函数、数据类型转换函数,还有我们之前学过的bool()都是这样,会返回一个值。而print()函数本身比较特殊,它在屏幕上显示完相关的文本内容就没了,并不会返回一个值给我们。所以,它返回的是空值(None)。

其实是因为在这些例题中,我们的函数功能都是第一时间把参数打印出来。而在很多时候,当多个函数之间相互配合时,我们并不需要第一时间就将结果打印出来,而是需要将某个返回值先放着,等到需要的时候再做进一步的处理。

但是这样的代码还有个问题,当我想多次调用函数的时候,就需要先复制print那行代码,再分别修改两个函数里的参数。这样的操作既不简洁,也不优雅。

def face(name):
    return name + '的脸蛋'
def body(name):
    return name + '的身材'
def main(dream_face,dream_body):
    return '我的梦中情人:' + face(dream_face) + ' + ' + body(dream_body)

print(main('李若彤','林志玲'))
print(main('新垣结衣','长泽雅美'))

现在,请你自己写一遍,相信印象会更深。尽量不要看原来的代码,参数名可以另取。

def lover(name1,name2):
    face = name1 + '的脸蛋'
    body = name2 + '的身材'
    return face,body

a=lover('李若彤','林志玲')
print('我的梦中情人:'+a[0]+' + '+a[1])

事实上,Python语言中的函数返回值可以是多个,而其他语言都不行,这是Python相比其他语言的简便和灵活之处。一次接受多个返回值的数据类型就是元组。

return还有一个“副作用”:一旦函数内部遇到return语句,就会停止执行并返回结果。

当我们定义一个函数的时候,很重要的事情就是理解函数中变量的作用域。下面请你先认真看下面两行字:

第一点:在一个函数内定义的变量仅能在函数内部使用(局部作用域),它们被称作【局部变量】。

第二点:在所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域),它们叫【全局变量】。

虽然变量的名字相同(都是x),但因为全局变量和局部变量处在不同的“作用域”中,所以它们彼此井水不犯河水,都能打印出相应的结果。

但为了让程序更易读以及避免可能会出现的麻烦,建议局部变量和全局变量【不要】取相同的名字,以免混淆。

你可以将定义的函数想象成一个私人房间,所以里面存数据的容器(变量)是私有的,只能在个人的房间里使用;而在函数外存数据的变量是公用的,没有使用限制。

有几点需要注意。就像你不希望合租的人随意使用你私人房间里的物品,全局作用域中的代码中也不能使用任何局部变量。来看看一个新手容易踩的坑:

def egg():    
    global quantity
#global语句将变量quantity声明为全局变量
    quantity = 108
    
egg()
print(quantity)

猜你喜欢

转载自blog.csdn.net/m0_73505947/article/details/129776307