# 函数:函数是带名字的代码块,用于完成具体的工作。要执行函数定义的特殊任务,可调用该函数。,当需要在程序中多次执行同一项任务时,无需反复编写完成该任务的代码,只需要调用执行该任务的函数,让python运行其中的代码即可。

# 函数定义

def greet_user():

    """显示简单的问候语"""

    print("Hello!")

# 第一行代码使用关键字def来告诉python,你要定义一个函数,这是函数定义,并在后面接上函数名,后面括号就是接收参数,可以为空,但是括号不能省,最后以冒号结尾。后面紧接着的缩进的代码就是函数体。

# 使用greet_user()函数,就直接调用它

greet_user()

# 向函数传递信息

def greet_user(username):

    """显示简单的问候语"""

    print(f"Hello,{username} !")

    print(type(username))

greet_user('jesse')

greet_user(123)

greet_user([1,2,3])

# 如果函数定义时提供了参数,调用时必须提供参数,否则会得到错误。然后上面我做了三种数据格式作为参数传入,这里可以看到,python会自动将参数转为对应的数据类型。

# 实参和形参

# 在上面的函数定义中,变量username就是形参,而函数调用中传递的jesse就是实参。这一个我其实觉得无所谓,和写代码不相关

# 传递实参:位置实参、关键字实参和默认值

# 位置实参:在调用函数时,python必须将函数调用中的每个实参关联到函数定义中的一个形参。最简单的方式是基于实参的顺序进行关联。以这种方式关联的实参成为位置实参。

def describe_pet(animal_type,pet_name):

    """显示宠物的信息"""

    print(f"\nI have a {animal_type}.")

    print(f"My {animal_type}'s name is {pet_name.title()}.")

describe_pet('hamster','harry')

describe_pet('dog','willie')

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

describe_pet(animal_type='hamster',pet_name='harry')

describe_pet(pet_name='harry',animal_type='hamster')

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

# # 注意点:默认值必须位于所有非默认参数之后。不然python可能会将位置实参与默认值匹配致错误。

def describe_pet(pet_name,animal_type='dog'):

    """显示宠物的信息"""

    print(f"\nI have a {animal_type}.")

    print(f"My {animal_type}'s name is {pet_name.title()}.")

describe_pet('willie')

describe_pet(pet_name='willie')

describe_pet('harry','hamster')

# 返回值:函数返回的值称为返回值。,在函数中,可以使用return语句将值返回到调用函数的那行代码。

# 返回简单的值

def get_formatted_name(first_name,last_name):

    """返回整洁的姓名"""

    full_name=f"{first_name} {last_name}"

    return full_name.title()

musician=get_formatted_name('jimi','hendrix')

print(musician)

# 让实参变成可选的:在形参列表中,可指定默认值。这样,在调用函数时,若没有提供形参,Python将使用默认值。然后在函数体里面给出默认参数的判断语句,这样就比较灵活地使用了

def get_formatted_name(first_name,last_name,middle_name=''):

    """返回整洁的姓名"""

    if middle_name:  # 如果有中间名,则返回中间名。中间名为空串,在这里会判断为false

        full_name=f"{first_name} {middle_name} {last_name}"

    else:

        full_name=f"{first_name} {last_name}"

    return full_name.title()

musician=get_formatted_name('jimi','hendrix')

print(musician)

# 返回字典:函数可返回任何类型的值,包括列表和字典等较为复杂的数据结构。

def build_person(first_name,last_name):

    """返回一个字典,其中包含有关一个人的信息"""

    person={'first':first_name,'last':last_name}

    return person

musician=build_person('jimi','hendrix')

print(musician)

# 传递列表:函数可以接受任意数量的参数,这些参数都保存在形参列表中。

def greet_users(names):

    """向列表中的每位用户都发出简单的问候"""

    for name in names:

        msg=f"Hello,{name.title()}!"

        print(msg)

usernames=['hannah','ty','margot']

greet_users(usernames)

# 在函数中修改列表:函数调用时,可修改列表。

# 将列表传递给函数后,函数就可以对其进行修改了。在函数中对这个列表所做的任何修改都是永久的,这让你能够高效地处理大量数据。

def print_models(unprinted_designs,completed_models):

    """模拟打印每个设计,直到没有未打印的设计为止"""

    """打印每个设计后,都将其移到列表completed_models中"""

    while unprinted_designs:

        current_design=unprinted_designs.pop()

        print(f"Printing model:{current_design}")

        completed_models.append(current_design)

def show_completed_models(completed_models):

    """显示打印好的所有模型"""

    print("\nThe following models have been printed:")

    for completed_model in completed_models:

        print(completed_model)

unprinted_designs=['phone case','robot pendant','dodecahedron']

completed_models=[]

print_models(unprinted_designs,completed_models)

show_completed_models(completed_models)

# 禁止函数修改列表:可向函数传递列表的副本而不是原始列表。

# 切片表示法:[:]创建列表的副本

def print_models(unprinted_designs,completed_models):

    """模拟打印每个设计,直到没有未打印的设计为止"""

    """打印每个设计后,都将其移到列表completed_models中"""

    while unprinted_designs:

        current_design=unprinted_designs.pop()

        print(f"Printing model:{current_design}")

        completed_models.append(current_design)

def show_completed_models(completed_models):

    """显示打印好的所有模型"""

    print("\nThe following models have been printed:")

    for completed_model in completed_models:    

        print(completed_model)        

unprinted_designs=['phone case','robot pendant','dodecahedron']

completed_models=[]

print_models(unprinted_designs[:],completed_models)

show_completed_models(completed_models)

# 传递任意数量的实参:使用星号(*)

def make_pizza(*toppings):

    """打印顾客点的所有配料"""

    print(toppings)

make_pizza('pepperoni')

make_pizza('mushrooms','green peppers','extra cheese')

# 形参名*toppings中的星号让python创建一个名为toppings的元组,该元组包含函数收到的所有值。

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

def make_pizza(size,*toppings):

    """打印顾客点的所有配料"""

    print(f"\nMaking a {size}-inch pizza with the following toppings:")

    for topping in toppings:

        print(f"- {topping}")

make_pizza(16,'pepperoni')

make_pizza(12,'mushrooms','green peppers','extra cheese')

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

def build_profile(first,last,**user_info):

    """创建一个字典,其中包含我们知道的用户信息"""

    profile={}

    profile['first_name']=first

    profile['last_name']=last

    for key,value in user_info.items():

        profile[key]=value

    return profile

user_profile=build_profile('albert','einstein',location='princeton',field='physics')

print(user_profile)

# 我们经常会看到形参名**kwargs,它用于收集任意数量的关键字实参。

# 将函数存储在模块中(这部分后面都是没有演示示例的,因为在写文的时候没办法展示不同的文件)

# 将函数存储在称为模块的独立文件中,再将模块导入(import)主程序。import语句可让你在当前运行的程序文件中使用模块中的代码。

# import pizza

# pizza.make_pizza(16,'pepperoni')  //这里的使用的方式是候,使用模块名.函数名()

# 导入整个模块:模块是扩展名为.py的文件,包含要导入程序的代码。

# eg:import pizza

# 这里pizza'是模块的名称,表示模块的文件名,但不包括扩展名。

# 导入特定的函数:

# eg:from pizza import make_pizza, make_pizza2

# 这里的make_pizza和make_pizza2是函数的名称。pizza'是模块的名称。多个函数用逗号隔开。

# 使用as给函数指定别名

# eg:from pizza import make_pizza as mp

# 这里的mp是函数的别名。

# 使用as给模块指定别名

# eg:import pizza as p

# 这里的p是模块的别名。

# 导入模块中的所有函数

# eg:from pizza import *

# 这里的*表示导入模块中的所有函数。使用方式是:直接调用函数名即可。


 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐