调用函数
Python自己就拥有很多函数,比如常用的input()
和print()
:
name = input ("What's your name? ")
print ("Hello," , name)
这个程序读取用户输入的内容并以特定的格式显示出来。
定义函数
下面是一个显示问候语的函数,名为greet_user()
:
def greet_user(): # 定义greet_user函数
"""显示简单友好的问候"""
print ("Hello!")
greet_user() # 调用greet_user函数
这个例子展示了最简单的函数结构。
def greet_user():
,使用关键字def
表示要定义一个函数,greet_user
是函数的名字,()
内写函数执行需要的参数,最后以冒号:
结尾。
由于这个函数不需要其他参数,所以()
是空的。
函数体内部的"""显示简单友好的问候"""
是被称为文档字符串的注释,描述函数是做什么的;注释内容由三引号"""
括起来,Python用它们来生成文档。
函数体内部的代码行就是函数要做的工作,在本例中,函数只打印"Hello!"
字符串。
调用函数时,只需要指定函数名和参数即可,greet_user()
不需要任何参数,所以写空括号:
greet_user()
只需要稍作修改,就可以将greet_user()
改造成对任何给定用户显示欢迎信息:
def greet_user_name (name): # 定义函数
"""对特定用户显示简单友好的问候"""
print ("Hello," , name , "!")
greet_user_name('mwang') # 调用函数
greet_user_name('liqiang') # 又一次调用函数
可以看到,我们在定义函数行函数名后面的括号里添加了name
变量,并且在函数体内部打印欢迎信息时使用了该变量。
在调用需要指定参数的函数时,只需要在调用语句函数名后面的括号中给定参数即可,比如:
greet_user_name('mwang')
这个语句将字符串mwang
作为参数传递给greet_user_name
函数,函数会接受参数并且使用它。
整个程序的执行示例如下:
Hello, mwang !
Hello, liqiang !
形式参数与实际参数
让我们重温这段程序:
def greet_user_name (name): # 定义函数
"""对特定用户显示简单友好的问候"""
print ("Hello," , name , "!")
greet_user_name('mwang') # 调用函数
greet_user_name('liqiang') # 调用函数
在函数定义中,参数变量name
称为形式参数(形参),它是函数完成工作所需的信息。
在函数调用中传递给函数的信息叫做实际参数(实参),比如本例中的'mwang'
和'liqiang'
。
将实参传递给函数后,它被保存在形参name
里。
四种参数
位置参数
最常用的是位置参数,比如下面的函数:
def describe_pet_1 (name, animal_type):
"""显示用户名和其宠物(位置参数)"""
print ("Hi! I'm " + name + ". My pet is a(n) " + animal_type + ".")
函数名是describe_pet_1
,具有两个参数,分别是name
和animal_type
。
这个例子中,参数的顺序都是确定的,因此叫做位置参数。
调用该函数:
describe_pet_1 ('Li Hua', 'dog')
执行结果:
Hi! I'm Li Hua. My pet is a(n) dog.
可以看到,程序得到了正确的执行。
对于使用位置参数的函数,如果调用该函数时参数数目不对,Python会给出错误。
如果搞错了参数的顺序,即便程序得到正确执行,也可能会发生笑话,比如使用下面的语句调用该函数:
describe_pet_1 ('a dog', 'Li Hua')
执行结果如下:
Hi! I'm a dog. My pet is a(n) Li Hua.
结果李华成了狗的宠物,令人啼笑皆非。
关键字参数
为了避免上面的尴尬,在只记得形参名而不记得其顺序的时候,可以使用关键字参数。比如这样调用describe_pet_1
函数:
describe_pet_1 (animal_type = 'dog', name = 'Li Hua')
上面的例子中,使用形参 = 实参
的格式为每个形参赋值,由于一一对应,所以即便顺序不对,Python也能很好的对应形参与实参。程序执行如下:
Hi! I'm Li Hua. My pet is a(n) dog.
默认参数
可以在函数定义中为形参赋予一个默认值,如下例:
def describe_pet_2 (name, animal_type = ", oh, I don't have a pet"):
"""显示用户名和其宠物(默认参数)"""
print ("Hi! I'm " + name + ". My pet is a(n) " + animal_type + ".")
程序中使用形参名 = 值
的格式为参数赋默认值。
调用该函数时,仍然需要指定name
的值,但是是否指定animal_type
的值是可选的:在不指定时,使用默认值(", oh, I don't have a pet"
);在指定时,使用指定值。
对于下面的调用:
describe_pet_2 ('Zhang 3')
结果如下:
Hi! I'm Zhang 3. My pet is a(n) , oh, I don't have a pet.
调用时并没有给出第二个参数(animal_type
)的值,因此使用其默认值。
对于下面的调用:
describe_pet_2 ('Li 4', 'cat')
第二个参数被指定,则使用其指定值,运行结果如下:
Hi! I'm Li 4. My pet is a(n) cat.
需要注意的是,默认参数一般放在最后,因为是否对其赋值是可选的。在上面的例子中,如果在调用中只指定了animal_type
一个实参,则Python仍然会将其当成第一个参数name
处理。
不定长参数
如果需要传入的参数个数没有确定,则可以使用不定长参数。
下面是一个不定长参数的例子:
def describe_pet_3 (name, *animal_type):
"""显示用户名和其宠物(不定长参数)"""
print ("Name: " + name)
print ("Pets:")
for pet in animal_type:
print ("- " + pet)
在参数animal_type
前加*
将其作为不定长参数,它可以接受0或多个实参。
调用该函数时,第一个实参被指定为第一个形参name
的值,其余的实参被指定为第二个形参animal_type
的值。
调用该函数:
describe_pet_3 ('Wang 5', 'Bear', 'Deer', 'Duck', 'Goose')
执行结果如下:
Name: Wang 5
Pets:
- Bear
- Deer
- Duck
- Goose
可以看到,第一个实参Wang 5
被指定为第一个形参name
的值,其余的实参被指定为第二个形参animal_type
的值(实际上是将其作为一个元组赋值给形参)。
不可变类型与可变类型的参数传递
在Python中,数字、字符串和元组是不可变的类型,列表和字典是可变的类型。
在Python中传递参数时:
- 对于不可变类型,传递的是一个值的拷贝。
- 对于可变类型,传递的即是原值。
返回值
Python中返回值非常简单,使用return
语句即可:
def get_full_name (first_name, last_name):
full_name = first_name + last_name
return full_name
该函数接受名和姓,将其连接为一个整体,并返回。
计算多个数字之和
现在写一个程序,它可以读取用户输入的多个数字,并将其结果返回。它的大致流程如下:
- 程序开始。
- 显示欢迎信息。
- 读取用户输入。
- 对用户输入进行处理,并将其转化成数字。
- 求和。
- 显示结果。
- 显示结束信息。
- 程序结束。
程序主体结构如下:
say_hello() # 显示欢迎信息
numbers_str_list = get_numbers_str_list() # 得到用户输入
numbers_list = get_numbers_list (numbers_str_list) # 将用户输入转化成数字
sum_of_numbers = sum_up (numbers_list) # 计算数字之和
say_result (sum_of_numbers) # 显示结果
say_bye() # 显示结束信息
say_hello()
和say_bye()
非常简单,不再多做解释:
def say_hello ():
"""显示欢迎信息"""
print ("你好!我能计算几个数字之和!")
username = input ("你的名字是? ")
print ("欢迎, " + username + ". 现在开始吧!")
def say_bye ():
"""显示结束信息"""
print ('感谢您的参与,再见!')
get_numbers_str_list()
不接收参数,它读取用户的输入的字符串,按空格分割字符串,将其保存在一个列表里,并返回该列表:
def get_numbers_str_list ():
"""得到用户输入的字符串列表"""
numbers_str = input ("请输入您的数字,用空格分割: ")
numbers_str = numbers_str.strip()
numbers_str_list = numbers_str.split()
return numbers_str_list # 返回了字符串列表
在的到用户输入的字符串列表后,需要把它转换成数字列表,这就是get_numbers_list()
的作用,它接受一个列表作为参数,将列表中的值转换成数字,并返回该数字列表。如果转换失败,则会显示错误信息。该函数如下:
def get_numbers_list (numbers_str_list):
"""将字符串列表转化成数字列表"""
numbers_list = list()
for number in numbers_str_list:
try:
number = float (number)
except:
print ('您输入的不是数字, ' + number)
exit ()
numbers_list.append(number)
return numbers_list # 返回了数字列表
至此,如果一切顺利,我们获得了用户的输入的数字列表,仅需要对列表中的值求和就行:
def sum_up (numbers):
"""求和"""
count = 0
count = sum (numbers)
return count # 返回了数字
显示计算结果:
def say_result (sum_num):
"""输出计算结果"""
print ('它们的和是: ' + str(sum_num))
执行该程序的示例如下:
$ python sum_numbers.py
你好!我能计算几个数字之和!
你的名字是? mwang
欢迎, mwang. 现在开始吧!
请输入您的数字,用空格分割: 1.1 2.2 3.3 4.4 5.5
它们的和是: 16.5
感谢您的参与,再见!
网友评论