python——函数
1.定义函数
函数:开发程序过程中,为提高编写代码效率及代码的可重用,将具有独立功能的代码块组织成为一个个小模块,称之为函数。
1.1 基本规则
def <函数名>(参数(0个或多个)):
'''函数体'''
return <返回值>
- -定义一个则函数需要使用关键字def,后面紧跟函数名和括号括起的参数列表,且后面要以冒号‘:’结尾。
- 自定义的函数名由字母,下划线和数字组成,但不能以数字开头。
- 括号中的参数和return根据需要使用,可以有也可以没有。
1.2 函数调用
在python中函数必须要先定义才能使用,函数调用直接使用函数名并在小括号中写入实参即可,如下例:
def favorite_book(book_1): #函数名
'''函数体'''
print(f'one of my favorite books is {book_1.title()}')
favorite_book('Of human bondage')
加粗样式
前三行即为此函数的函数体,而第四行为函数的调用,并传递了一个’of human bandage’的实参。
2.传递实参
函数定义中可能包含多个形参,因此函数调用时也可能包含多个实参,向函数传递实参的方法又很多,可使用位置传参,也可使用关键字实参,还可使用列表和字典,下面依次介绍这些方式。
2.1 位置实参
在python中基于实参的顺序的关联函数形参的关联方式称为位置实参。也是最为简单的关联方式。如下例:
def favorite_book(book_1,author_2): #设置book_1(书名)和author_2(作者)两个形参
print(f'one of my favorite books is {book_1.title()} written by {author_2.title()}')
favorite_book('Of human bondage','Maugham')
- 可以多次调用函数,每次调用传入不同的实参
- 根据位置实参时需要注意实参位置要和函数定义中的形参一一对应,按照顺序传参。
2.2 关键字实参
关键字实参是传递给函数的名称值对。可以不用考虑实参的顺序问题,直接在实参中将名称与值关联起来。如下例:
def favorite_book(book_1,author_2): #设置book_1(书名)和author_2(作者)两个形参
print(f'one of my favorite books is {book_1.title()} written by {author_2}')
favorite_book(book_1='Of human bondage',author_2='Maugham')
由结果看两种传参结果一致结果一致。
2.3 参数默认值
在编写函数时可以给形参设置默认值,这样就可以在函数调用时使用更少的实参。设置参数(函数定义的形参)时必选参数(必须传入实参的的参数)在前,默认参数在后。如下例:
def my_pet(name_2,pet_1='cat'): #设置pet_1(动物名)和name_2(名字)两个形参
print(f'I have a {pet_1.title()} named {name_2}')
my_pet('black')
3.返回值
函数并非总是直接显示输出,他还可以处理一系列数据并返回一个或者一组值,包括列表和字典。
def city_country(city_name,country_name): #返回简单值
names = f'{city_name},{country_name}'
return names
def make_album(singer_name,album_name):#返回字典
album = {'singer':singer_name,'album_1':album_name}
return album
message1 = city_country('beiing','china')
print(message1)
message2 = make_album('meimei','caroline')
print(message2)
4.传递列表
我们经常会发现,向函数传递列表很有用,讲课列表传入给函数后,函数就能直接访问其内容。下面使用函数
def greer_name(names): #形参为存储名字的names列表
for name in names: #for遍历列表打招呼
print(f'hello,{name.title()}')
names = ['mike','jim','alice']
greer_name(names)
4.1 在函数中修改列表
将列表传给函数后,函数就可对其进行修改,下例就是一个通过函数对列表进行修改的例子。
def show_message(messages): #便历列表
for message in messages:
print(message)
def send_message(print_messages,showed_messages):
while print_messages: #打印print_messages列表的值
printed_message = print_messages.pop() #打印一个prinrt_messages列表删去打印完的元素
print(f'printed message {printed_message}')
showed_messages.append(printed_message) #showed_messages列表添加已经打印完的列表)
show_message(showed_messages)
printed_messages = ['hot summer days','rock and roll']
showed_messages = []
print(f'printed_messages is {printed_messages}')
send_message(printed_messages,showed_messages)
4.2 禁止函数修改列表
有时我们需要禁止函数修改列表,如前面的例子我们在发送消息后需要保留原来需要发送消息的列表,但我们发送下消息后的print_messages列表已经边为空。为解决这个问题,我们就可以向函数传递列表的副本而非原件,即使用切片。
函数名(列表名[:])#切片表示格式
send_message(printed_messages[:],showed_messages) #将printed_messages列表切片
print(f'printed_messages is {printed_messages}')
结果如上图,使用副本后,原列表值不变。
5. 传递元组
预先不知道函数需要多少个实参,此时我们可以用加(*)的参数名来让python创建空元组来存放收到的实参。如下例:
def make_cake(*ingredients):
print(ingredients) #打印顾客需要的食材
make_cake('apple')
make_cake('chocolate','banana','Yellow peach')
6. 传递字典
有时我们需要接受任意数量的实参,但预先不知道它要传递的信息,这种情况下我们可将函数编写成能够接受任意数量的键值对。
def car_information(color,brand,**car_database): #汽车信息储存函数
car_database['c_color'] = color
car_database['c_brand'] = brand
return car_database
user_car = car_information('blue','Benz',model='G500')
print(user_car)
本文参考书目:Python 编程 :从入门到实践 (第二版)/ (美) 埃里克•马瑟斯(Eric Matthes)著;袁国忠译