python入门学习:7.函数

时间:2023-12-05 10:44:26

python入门学习:7.函数

关键点:函数

7.1 定义函数7.2 传递实参7.3 返回值7.4 传递列表7.5 传递任意数量的实参7.6 将函数存储在模块中

7.1 定义函数

  使用关键字def告诉python要定义一个函数,紧接着跟着函数名,冒号。后面的缩进构成函数体.例如:

1def func_name():
2    函数体
3
4def greet_user():
5    """显示简单问候语"""
6    print("hello!")
7
8greet_user() #函数调用

7.1.1 向函数传递信息
  在定义函数市可以给函数传递一个参数

1def func_name(param):
2    函数体
3
4def greet_user(username):
5    """显示简单问候语"""
6    print("hello!"+ username.title()+"!")
7greet_user('jessue')

7.1.2 实参和形参
  在函数greet_user()的定义中,变量username是一个形参--函数完成工作所需的一项信息。在代码greet_user('jessue')中,值'jessue'是一个实参。实参是调用函数时传递给函数的信息,我们调用函数时,实际上将实参'jessue'传递给了函数greet_user()的形参username中,然后进行操作。

7.2 传递实参

7.2.1 位置实参
  调用函数时,python必须将函数调用中的每个实参都关联到函数定义中的一个形参。为此,最简单的方式是基于实参的顺序。这种关联方式被称为位置实参。

1def describe_pet(animal_type,pet_name):
2    print("\nI have a " + animal_type + ".")
3    print("My " + animal_type + "'s name is " + pet_name.title() + ".")
4
5describe_pet('hamster','harry')
6#注意:位置实参的顺序很重要,如果顺序错误可能结果出乎意料

7.2.2 关键字实参
  关键字实参是传递给函数的名称-值对。你直接在实参中将名称和值关联起来了,因此向函数传递实参时不会混淆。关键字实参让你无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。

1def describe_pet(animal_type,pet_name):
2    print("\nI have a " + animal_type + ".")
3    print("My " + animal_type + "'s name is " + pet_name.title() + ".")
4
5#describe_pet(animal_type='hamster',pet_name='harry')
6describe_pet(pet_name='harry',animal_type='hamster')
7#关键字实参于顺序无关

7.2.3 默认值
  编写函数时,可给每个形参指定默认值。在调用函数中给形参提供了实参时,python将使用指定的实参值;否则将使用形参默认值。因此,给形参指定默认值后,可在函数调用中省略相应的实参

1def describe_pet(pet_name,animal_type='dog'):
2    print("\nI have a " + animal_type + ".")
3    print("My " + animal_type + "'s name is " + pet_name.title() + ".")
4
5#describe_pet(pet_name='wille')
6describe_pet(pet_name='wille',animal_type='cat')

  注意:在这个函数中修改了形参的顺序。由于animal_type指定了默认值,无需要通过实参来指定动物类型,因此函数调用中只包含了一个实参--宠物的名字。然而python依然将这个实参视为位置实参,因此函数调用中只包含宠物的名字,这个实参将关联到函数定义的第一个形参。
  使用默认值时,在形参列表中必须先列出没有默认值的形参,在列出有默认值的形参,这让python依然能够正确地解读位置实参。

7.3 返回值

  函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值。
7.3.1 返回简单值
  如下返回一个字符串

1def get_formatted_name(first_name,last_name):
2    full_name = first_name + ' ' + last_name
3    return full_name.title() #返回值
4
5musician = get_formatted_name('jimi','hendrix')
6print(musician)

7.3.2 让实参变成可选择的
  有时候,需要让实参变成可选择的,这样使用函数的人就只用在必要时才提供额外信息。可使用默认值来让实参变成可选择的。

 1def get_formatted_name(first_name,last_name,middle_name=''):
2    if middle_name:
3        full_name = first_name + ' ' + middle_name + ' ' + last_name
4    else:
5        full_name = first_name + ' ' + last_name
6    return full_name.title()
7
8musician = get_formatted_name('jimi','hendrix')
9print(musician)
10
11musician = get_formatted_name('jimi','hendrix','lee')
12print(musician)

7.3.3 返回字典
  函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。下面定义一个函数,返回一个字典

1def build_person(frist_name,last_name):
2    person = {'frist':frist_name,'last':last_name}
3    return person #返回一个字典
4musician = build_person('jimi','hendrix')
5print(musician)

7.3.4 结合使用函数和while循环

 1def get_formatted_name(first_name,last_name):
2    full_name = first_name + ' ' + last_name
3    return full_name.title()
4
5while True:
6    print("\nPlease tell mme your name:")
7    print("(enter 'q' at any time to quit)")
8    f_name = input("Frist name: ")
9    if f_name == 'q':
10        break
11    l_name = input("Last name: ")
12    if l_name == 'q':
13        break   
14
15    formatted_name = get_formatted_name(f_name,l_name)
16    print("\nHello, "+ formatted_name+"!")

7.4 传递列表

  向函数传递一个列表

1def greet_users(names):
2    for name in names:
3        msg = "Hello, " + name.title()+"!"
4        print(msg)
5
6user_names = ['hannah','ty','margot']
7greet_users(user_names)

7.4.1 在函数中修改列表
  将列表传递给函数后,可对列表进行修改

 1def print_models(unprinted_designs,completed_models):
2    while unprinted_designs:
3        current_design = unprinted_designs.pop()
4
5        print("Printing model: "+ current_design)
6        completed_models.append(current_design)
7
8def show_complete_models(completed_models):
9    print("\nThe following models have been printed:")
10    for completed_model in completed_models:
11        print(completed_model)
12
13unprinted_designs = ['iphone case','robot pendant','dodecadron']
14completed_models = []
15print_models(unprinted_designs,completed_models)
16show_complete_models(completed_models)

7.4.2 禁止函数修改列表
  有时候需要禁止函数修改列表,可以向函数传递一个列表的副本而不是原件,这样就可以避免列表被修改。

1fuc_name(list_name[:])
2print(unprinted_designs[:],completed_models)

7.5 传递任意数量的实参

  有时候,你预先不知道函数要接受多少个实参,不过python支持传递任意数量的实参。

1def make_pizaa(*topping)
2    print(topping)
3make_pizaa('pepperoni')
4make_pizaa('mushroom','green pepers','extra chesse')
5
6('pepperoni',)
7('mushroom', 'green pepers', 'extra chesse')

7.5.1 结合使用位置实参和任意数量实参
  如果让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。

 1def make_pizaa(size,*toppings): #*toppings 传递一系列字符串
2    print("\nMaking a "+str(size) + "-inch pizza with the following toppings:")
3
4    for topping in toppings:
5        print("- " + topping)
6make_pizaa(16,'pepperoni')
7make_pizaa(12,'mushroom','green pepers','extra chesse')
8
9Making a 16-inch pizza with the following toppings:
10- pepperoni
11
12Making a 12-inch pizza with the following toppings:
13- mushroom
14- green pepers
15- extra chesse

7.5.2 使用任意数量的关键字实参
  有时候,需要接受任意数量的实参,但预先不知道传递函数的会是什么样的信息。再这种情况下,可将函数编写成能够接受任意数量的键-值对--调用语句提供了多少就接受多少。

 1def build_profile(first,last,**user_info): #**user_info传递一系列键-值对
2    profile = {}
3    profile['first_name'] = first
4    profile['last_name'] = last
5    for key,value in user_info.items():
6        profile['key'] = value
7    return profile
8
9user_profile = build_profile('albert','einstein',location='princeton',field = 'physics')
10print(user_profile)

7.6 将函数存储在模块中

  函数的优点之一是,使用它们可将代码块与主程序分离。你还可以更进一步,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。import语句允许当前运行的程序文件中使用模块中的代码。
7.6.1 导入整个模块
  要让函数是可导入的,得先创建模块。模块是扩展名为.py的文件,包含要导入到程序中的代码。下面创建一个包含函数make_pizza()的模块。

 1#在pizza.py中定义make_pizza()函数
2def make_pizza(size,*toppings):
3    """概述要制作的pizza"""
4    print("\nMaking a " + str(size)+ "-inch pizza with the following toppings:")
5    for topping in toppings:
6        print("- "+topping)
7
8#在主程序中import pizza
9import pizza
10pizza.make_pizza(16,'pepperoni')
11pizza.make_pizza(12,'mushroom','green pepers','extra chesse')
12
13
14Making a 16-inch pizza with the following toppings:
15- pepperoni
16
17Making a 12-inch pizza with the following toppings:
18- mushroom
19- green pepers
20- extra chesse

  只需要编写一条import语句并在其中指出模块名,就可以在程序中使用该模块的所有函数。

1import module_name  #module_name.py模块
2module_name.function_name()

7.6.2 导入特定函数
  你还可以导入模块的特定函数

1from module_name import function_name
2#通过逗号分割函数名
3from module_name import function_name1,function_name2
4#对于前面的pizza模块可以使用如下导入
5from pizza import make_pizza
6make_pizaa(16,'pepperoni') #直接调用函数即可
7make_pizaa(12,'mushroom','green pepers','extra chesse')

7.6.3 使用as给函数指定别名
  如果要导入的函数名称可能与程序中现有名称冲突,或者函数的名称太长,可指定简短而独一无二的别名。导入时通过as实现

1from module_name import function_name as new_function_name 
2from pizza import make_pizza as mp
3mp(16,'pepperoni') #直接调用mp
4mp(12,'mushroom','green pepers','extra chesse')

7.6.4 使用as给模块指定别名
  使用as还可以给模块指定别名

1import pizza as p
2p.make_pizaa(16,'pepperoni') #直接调用函数即可
3p.make_pizaa(12,'mushroom','green pepers','extra chesse')

7.6.5 导入模块中的所有函数
  使用星号(*)可导入模块中的所有函数。一般不建议这样做,容易发送函数名冲突
from pizza import *
make_pizaa(16,'pepperoni') #直接调用函数即可
make_pizaa(12,'mushroom','green pepers','extra chesse')