Python函数基础内容学习

1 函数初步

1.1 函数是什么?

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

        就像日常生活中解决一个任务一样,我们会自觉地将整个任务按照内容划分为不同部分,再逐个地完成各个小部分,最终自然完成了整个任务。编写函数的意义之一就在于此,那函数另外重要意义之一在于当需要多次执行相同代码时,只需要调用函数即可,使程序编写更加简洁、便捷。

1.2 函数长什么样?

        Python中使用关键字def来定义函数:

#定义一个函数
def greet_user():
    """显示简单的问候信息"""
    print("Hello!")

#调用函数
greet_user()

----------------------以下是打印结果
Hello!

        greet_user()函数名,当需要使用该函数时,调用该函数名即可;greet_user()中的括号不能丢掉,括号内可放置函数需要的参数,即使括号内不放置任何内容也不能把括号丢掉;函数定义括号后的“:”不可漏写。

1.3 实参与形参

        形参是在定义函数时放置在函数名括号内的参数;实参是在调用函数时放置在函数名括号内的参数,是传递给函数的信息。如下示例中,username为形参,"Bob"为实参。

#定义一个函数
def greet_user(username):
    """显示简单的问候信息"""
    print(f"Hello, {username}!")

#调用函数
greet_user("Bob")

        函数定义中可能包含多个形参,相应地,函数调用中也可能包含多个实参。向函数传递实参有多种方式:位置实参关键字实参等。

        1.位置实参

        在调用函数时,每个实参必须与每个形参相关联,最简单的方式是基于实参的顺序进行关联。如下示例中,"Bob"被赋给形参name,"apple"被赋给形参fruit,就是单纯按照顺序进行关联。因此,当使用位置实参时,需要注意确认每个实参的顺序。

def describe_hobby(name,fruit):
    """简单描述每个人喜欢的水果"""
    print(f"{name.title()} love {fruit}!")

describe_hobby("Bob","apple")

---------------------------以下为打印结果
Bob love apple!

        2.关键字实参

        关键字实参是传递给函数的名值对,直接在实参中将名称和值关联起来。示例中直接指明了将"Bob"赋给形参name,将"apple"赋给形参fruit。

def describe_hobby(name,fruit):
    """简单描述每个人喜欢的水果"""
    print(f"{name.title()} love {fruit}!")

describe_hobby(name="Bob",fruit="apple")

---------------------------以下为打印结果
Bob love apple!

        3.默认值

        在定义函数时,可以给每个形参指定默认值。如果在调用函数的过程中给形参提供了实参,Python将使用提供的实参;否则,将使用形参的指定值。如下示例中,在定义函数时为形参fruit指定了默认值"banana"example1中对形参name与fruit均使用了关键字实参,因此函数输出将会是所提供的"Bob"与"apple";example2中对形参name使用了关键字实参"Alice",未对形参fruit指定任何值,因此函数输出将会是所提供的"Alice"与默认值"banana";example3使用的是位置实参"Tinna",且只提供了一个实参,因此Pyhon将根据位置实参的规则为形参赋值,"Tinna"被赋值给第一个形参name,第二个形参使用默认值"banana"。

def describe_hobby(name,fruit="banana"):
    """简单描述每个人喜欢的水果"""
    print(f"{name.title()} love {fruit}!")

describe_hobby(name="Bob",fruit="apple")  #example1
describe_hobby(name="Alice")              #example2
describe_hobby("Tinna")                   #example3

---------------------------以下为打印结果
Bob love apple!
Alice love banana!
Tinna love banana!

1.4 返回值

        函数可以用于处理一些数据,并使用return语句返回一个或一组值。函数返回的值称为返回值。函数可返回任何类型的值,包括列表和字典等较为复杂的数据结构。

def name(first_name,last_name):
    """定义一个函数,返回一个字典类型"""
    full_name={'first':first_name,'last':last_name}
    return full_name

#测试
musician=name("jimi","Bob")
print(musician)

----------------------以下是打印结果
{'first': 'jimi', 'last': 'Bob'}

2 函数进阶

2.1 传递列表

        如下一个示例向函数传递一个列表,函数接受列表后就能访问列表中的每个值并进行相应处理。

def greet_user(names):
    """定义一个函数,用于接收列表并进行相关处理"""
    for name in names:
        print(f"Hello, {name.title()}!")

#测试
names=['Alice','Bob','Tinna','David']
greet_user(names)

---------------------------以下是打印结果
Hello, Alice!
Hello, Bob!
Hello, Tinna!
Hello, David!

2.2 传递任意数量的实参

        当预先不知道函数需要接受多少个实参时,可以设定元组形参。如下示例中,形参名*user中的星号让Python创建一个名为user的元组。如果要让函数接受不同类型的实参(比如混合使用位置是实参等),必须在函数定义中将接受任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。

def name(*user):
    print(user)

#测试
name("Bob","Alice","Tinna")

-----------------以下是打印结果
('Bob','Alice','Tinna')
使用任意数量的关键字实参

        有时候需要接受任意数量的实参,但事先不知道传递给函数的会是什么样的信息,可将函数定义成能够接受任意数量的键值对。如下示例中,形参**user_infor中的两个星号让Python创建一个名为user_infor的字典,该字典包含函数收到的其他所有名值对。

def build_profile(first_name,last_name,**user_infor):
    """创建一个函数,可用于接收任意信息"""
    user_infor['first']=first_name
    user_infor['last']=last_name
    return user_infor

# 测试
user_infor=build_profile('John','Doe',age=25,city='New Yourk')
print(user_infor)

-----------------------------以下是打印结果
{'age': 25, 'city': 'New Yourk', 'first': 'John', 'last': 'Doe'}

2.3 将函数存储在模块中

        模块是扩展名为.py的文件,包含要导入程序的代码。将函数存储在模块中,形成独立文件,当在今后编程过程中需要使用该函数时,直接导入即可,实现了函数的高效利用。例如,将示例中的两个函数保存在名为models.py的文件中。导入模块的方法有如下几种。

def print_models(unprinted_models,completed_models):
    """模拟打印每个设计,直到没有未打印的设计为止
    打印每个设计后,都将其添加到已完成的设计列表中
    """
    while unprinted_models:
        current_model=unprinted_models.pop()
        print("Printing model:",current_model)
        completed_models.append(current_model)
        
def show_completed_models(completed_models):
    """显示打印好的所有模型"""
    print("The following models have been printed:")
    for completed_model in completed_models:
        print(completed_model)
2.3.1 导入整个模块

        将刚创建的模块models.py导入文件test1.py中,如下示例,代码行import models会让Python打开文件models.py,并将其中的所有代码都复制到这个程序中,可在程序中使用模块中的所有函数。要调用被导入模块的函数,可指定被导入模块的名称和函数名,中间用点号连接。

import models

unprinted_models1=[101,102,104,110,112]
completed_models1=[]

models.print_models(unprinted_models1,completed_models1)
models.show_completed_models(completed_models1)
2.3.2 导入特定的函数

        如下语句可导入模块中的特定函数,如需导入同一个模块中的多个函数,可直接在该语句后面添加逗号和需要添加的函数名。之后在调用函数时,可不写模块名,只写函数名。

from models import print_models

print_models(unprinted_models1,completed_models1)
2.3.3 使用as给函数指定别名

        如果要导入的函数的名称太长或者可能与程序中既有的名称冲突,可为函数指定简短而独一无二的别名。之后在调用函数时,可直接使用函数的别名。也可用同样的方式为模块指定别名。

from models import print_models as pm

pm(unprinted_models1,completed_models1)
2.3.4 导入模块中的所有函数

        使用星号(*)运算符可让Python导入模块中的所有函数。由于导入了所有函数,可通过调用函数名称来调用每个函数。在使用并非自己编写的大型模块时,最好不要使用这种导入方法,因为如果模块中有函数名与当前项目中既有的名称相同,可能会出现意想不到的结果。

from models import *

        在这几种调用方法中,最佳的做法是,要么只导入需要使用的函数,要么导入整个模块并使用点号。让代码更清晰、更容易理解。

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值