函数

定义函数

一个简单函数

"""
   def 是为了告知 python 你要开始定义函数了
   greet_user是函数名
   name是形参,有些函数是没有形参, 形参的生命期仅限于函数以内
"""


def greet_user(name): # 注意冒号
    """ 打印问候语, 一般的函数都会有函数作用的说明"""
    print(f"Hello! {name}.")
    # 有时这里需要返回值


name1 = input("What's your name?")
greet_user(name1)
"""
调用函数,name1为实参,由于形参的生命期只在函数内,所以这个name1 可以换成 name
"""

 

传递实参

位置实参

用这种方式来传递实参要求实参和形参的顺序一样,因此使用这种方式需要格外小心。

如果顺序错误就会引起名字变成种类名之类的错误

 

def describe_pet(animal_type, pet_name):
    """显示宠物信息"""
    print(f"I have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name.title()}")

describe_pet('hamster', 'harry')

# 如果顺序错误会这样
print()
describe_pet('harry', 'hamster')

 

关键字实参

关键字实参是传递给函数的名称值对。

因为直接在实参中将名称和值关联起来,所以即使顺序变化传递实参时也不会混淆。

def describe_pet(animal_type, pet_name):
    """显示宠物信息"""
    print(f"I have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name.title()}")


describe_pet(animal_type='hamster', pet_name='harry')
# 上面这种就是关键字实参

 

默认值

在编写函数时,可以给每个形参指定默认值。

在调用函数时,python将使用指定的实参值;如果没有实参,就会使用默认值

注意默认形参必须,在非默认形参后面

def describe_pet(pet_name, animal_type='dog'):
    # 上面这个动物种类默认为dog
    """显示宠物信息"""
    print(f"I have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name.title()}")


#   提供了形参,所以会忽略掉默认参数
describe_pet(animal_type='hamster', pet_name='harry')
#   由于对动物类型指定了默认值,故只使用一个petname参数也是可以运行的
describe_pet(pet_name='lisa')
describe_pet('david') # 最简单的调用

 

常见的参数错误

实参数量不够或太多

采用位置实参时,实参顺序错误

非默认形参在默认形参后面

 

返回值

返回简单值

def get_formatted_name(first_name, last_name):
    """ 返回整洁的姓名"""
    full_name = f"{first_name} {last_name}"
    return full_name.title()
# return 返回值

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

 

让实参变成可选的

有时需要将实参变成可选的,但是python没有函数重载的定义,所以可以采用默认值来让实参变得可选

def get_formatted_name(first_name, last_name, middle_name =""):
    """ 返回整洁的姓名"""
    if middle_name:
        full_name = f'{first_name} {middle_name} {last_name}'
    else:
        full_name = f"{first_name} {last_name}"
    return full_name.title()
# return 返回值

first = input("first_name = \n")
middle = input("middle_name = (if you don't have, you can ignore it)\n")
last = input("last_name = \n")
if middle:
    musician = get_formatted_name(first, last, middle)
else:
    musician = get_formatted_name(first, last)
print(musician)

 

返回字典

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

def build_person(first_name, last_name):
    person = {'first': first_name, "last": last_name}
    return person

 

传递列表

向函数传递列表会很有用,其中包括名字,数或者更复杂的对象,

在学到算法时的,比如说要排序一个数组(也是数值列表)

在函数中修改列表

将列表传给函数后,函数就可以对其进行修改。函数对其的任何修改都是永久性的

如果不希望修改,可以只是传递列表的副本(注意是切片,忘记了就取看组织列表

以冒泡排序为例

def bubbleSort(arr):
    n = len(arr)
    # 遍历所有数组元素
    for i in range(n):
        # Last i elements are already in place
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]


arr = []
n = int(input("请输入数组长度:\n"))
i = 0
while i < n:
    arr.append(int(input()))
    i += 1
bubbleSort(arr)
print("排序后的数组:")
for i in range(n):
    print("%d" % arr[i])

 

传递任意数量的实参

形参名 *toppings中的星号让python创建一个名为toppings的元组,

并把收到的所有值都封装到这个元组中

def make_pizza(*toppings):
    print(toppings)
    
make_pizza('mushrooms')
make_pizza('green peppers', 'mushroom', 'extra cheese')

 

结合使用位置实参和任意位置数量实参

def make_pizza(size, *toppings):
    print(f"Making a {size}-inch pizza with the following toppings:")
    for topping in toppings:
        print(f'- {topping}')

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

 

使用任意数量的关键字实参

def build_profile(first, last, **user_info):
    """
        **user_info 是让python创建一个名为user_info的字典
        并将所接收到的所有键值对都存放进去
    """
    user_info["first_name"] = first
    user_info["last_name"] = last
    # 将 first 和 last 也存入字典中
    return user_info


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

 

将函数存储在模块中

使用函数的优点之一,可以实现代码块与主程序分离。

可以更进一步,将函数存于名为模块的独立文件中,再将模块导入到主程序中

import语句允许在当前运行的程序文件中使用模块中的代码

导入整个模块

要让函数是可导入的,得先创建模块。

模块是后缀名 .py 的文件,一般也在主程序当前文件中

使用module_name.function_name()来使用导入模块的任何一个函数

 

导入特定的函数

可以导入模块中的特定函数,这种导入方法如下:

from  module_name   import   function_1, function_2

这时候对应的语法就要发生变化

使用这种方法调用函数无需使用句点

 

使用as 给函数指定别名

别名——函数的另一个名称,类似于外号,不过这个外号要独一无二

一般在函数名很长的时候使用

 

使用as 给模块指定别名

 

导入模块中的所有函数

使用星号(*)运算符可以导入模块中的所有函数

posted @ 2022-03-25 23:05  我就一水  阅读(136)  评论(0)    收藏  举报