读书笔记——《Python编程从入门到实践》第八章

读书笔记——《Python编程从入门到实践》第八章

这一章主要讲解了函数和模块的知识。主要内容如下:

  • 函数
    • 如何定义函数
    • 函数的参数
    • 函数的返回值
    • 传递任意数量的实参(不定长参数)
  • 模块
    • 导入模块
    • 导入函数
    • 指定别名
  • 代码格式

函数

函数就是带名字的代码块,用于完成特定的任务。

如何定义函数

定义函数的语法如下所示:

def 函数名(参数列表):
    函数体
  • 定义函数以def关键词开头,后接函数名和以圆括号括起的参数,以及冒号。
  • 函数的第一行语句可以使用文档字符串编写函数说明,当然这只是建议,非必须。
  • 函数的函数体要进行缩进以表示他是函数体。
  • 可以使用return语句来返回函数的返回值。

定义函数的示例代码如下所示:

def display_message():
    """显示信息的函数"""
    print("这是一个函数,打印一个句子")


display_message()

函数的参数

函数定义中指定的函数需要的参数,叫做形参。函数调用时,给参数传递的参数叫做实参。Python的函数可以通过两种方式来传递参数,分别是位置实参跟关键字实参。

位置实参

按照形参的顺序来传递参数,一一对应,就叫做位置实参。如下示例所示:

def make_shirt(size, message):
    print(f"Make shirt, the size is {
      
      size}, the message is {
      
      message}")


# 使用位置实参制作T恤
make_shirt("xl", "加油")

我们定义了一个名为make_shirt的函数,这个函数定义了两个形参,分别是sizemessage。我们使用调用这个函数的时候,也分别传递了两个实参,我们没有说明哪个实参传递给哪个形参,那么就是按照位置顺序一一对应的。如上例中,“xl”传递给size形参,"加油"传递给message形参。

关键字实参

上面我们介绍了位置实参,传递的实参跟形参一一对应,那么是不是只有参数设置方式呢?不是的,还有一种叫做关键字实参。设置关键字实参的时候,需要说明实参是传递给哪个形参的,因此也就跟位置无关了。如下例所示:

def make_shirt(size, message):
    print(f"Make shirt, the size is {
      
      size}, the message is {
      
      message}")


# 使用关键字实参来调用函数
make_shirt(message="男人哭吧哭吧不是罪", size="xxl")

同样是make_shirt函数,注意调用函数的区别。使用关键字实参时,传递的是名称值对,形参名=实参,要注意的是要准确地指定形参名。

默认值

可以函数的形参指定默认值,调用函数的时候,设置了默认值的形参传递参数就变成可选的了。如果设置了实参,那么就使用实参。如果没有设置实参,就使用默认值。如果要给形参设置默认值,要将有默认值的参数放到后面,没有默认值的参数放到前面,这样才可以让位置实参依旧可以正常解析。示例如下所示:

def make_shirt(size="xl", message="I love Python"):
    print(f"Make shirt, the size is {
      
      size}, the message is {
      
      message}")


# 印有默认字样的大号T恤
make_shirt()

# 印有默认字样的中号T恤
make_shirt(size="m")

# 印有其他字样的T恤
make_shirt(message="垃圾回收")

还是make_shirt函数,不同的是,我们将参数sizemessage都设置了默认值,所以调用这个函数的时候,这两个参数就不是都必须要传递实参的了。

函数的返回值

前面我们也说了,我们可以使用关键字return来设置函数的返回值。如下所示:

def city_country(city, country):
    return f"{
      
      city} {
      
      country}"


# 使用三个城市国家来调用函数,并打印返回值
print(city_country("巴黎", "法国"))
print(city_country("香港", "中国"))
print(city_country("华盛顿", "美国"))

我们定义了一个函数city_country,这个函数返回了一个整合我们传递的实参返回的一个字符串。
返回值可以是任何类型,包括列表和字典等较复杂的数据结构。

传递任意数量的实参(不定长参数)

在很多编程语言中,都有不定长参数的概念,在Python中自然也不例外。可以分为不定长的位置实参和不定长的关键字实参。

不定长的位置实参

定义形参时,若在参数名前加一个星号,如*size,就表明这个参数是一个不定长参数,除了其他对应了形参的实参,其他的实参都会被以元组的形式设置给这个形参。如下例所示:

def make_sandwich(*foods):
    print(f"You make a sandwith, it contains {
      
      foods}")


if __name__ == '__main__':
    make_sandwich("鱼")
    make_sandwich("香肠", "猪肉")
    make_sandwich("蔬菜", "青椒", "灯笼椒")

我们定义了一个函数make_sandwich,这个函数包含了一个名为*foods的形参,由于参数名前带了一个星号*,所以我们知道这个是一个不定长的参数。
调用函数的时候,我们可以设置不定数量的实参,这些实参就将被作为元组的元素封装,并设置给foods参数。

不定长的关键字实参

前面我们讲解了在参数名前加一个星号*就可以将参数设置为不定长参数,可以接收不定个实参,并封装成元素。这里设置参数的方式是位置实参,那是否可以使用关键字实参呢?是可以的。
我们可以给形参加上两个星号**,表示此参数可以接受不定长的关键字实参,如下所示:

def user_profile(first_name, last_name, **user_profile):
    print(f"Hello {
      
      first_name} {
      
      last_name}, your user profile is {
      
      user_profile}")


if __name__ == '__main__':
    user_profile("王", "尚飞", age=20, sex="male", wife="王前走")

我们定义了一个名叫user_profile的函数,除了形参first_namelast_name之外,还有一个带了两个星号的参数user_profile,表示参数user_profile可以接受不定长的关键字实参。
所以如user_profile函数的调用代码所示,我们设置了agesexwife,这个三个我们并未定义的形参,这三个参数就将被封装到字典中,并设置给参数user_profile

模块

Python中一个文件即可称为一个模块,在项目越来越大,代码越来越多的时候,就必然要用到模块的功能,不然一个文件里的代码就太多了。

导入模块

导入模块,需要使用关键字import。模块就是扩展名为.py的文件。如下所示:
我们先编写一个文件printing_functions.py,里面的内容为:

def greet(name):
    print(f"Hello {
      
      name}, welcome to study python!")

然后我们在定义第二个文件printing_models.py,内容为:

import printing_functions

if __name__ == '__main__':
    printing_functions.greet("王尚飞")

这两个文件需要放在同一个文件夹下。如上面的代码所示,在printing_functions.py文件中,我们定义了一个叫做greet的函数。我们在printing_models.py文件中,使用import导入了这个模块,并通过模块名.函数的方式调用了模块里的函数。

导入函数

那么我们能不能只导入一个模块中的某一个函数呢?当然也是可以了,不过我们除了要使用import关键字,还需要使用from关键字。
如下代码所示:
我们先创建一个模块,名字叫greet.py,里面的内容为:

def greet_alien(name):
    print(f"Hello {
      
      name}, welcome to study python!")

然后我们再创建一个名为main.py的模块,里面的内容为:

from greet import greet_alien

if __name__ == '__main__':
    greet_alien("王尚飞")

在模块greet.py中,我们定义了一个名为greet_alien的函数,这个函数用来跟外星人打招呼。然后我们又定义了一个名为main.py的模块,这个模块中,我们导入了这个打招呼的函数,并调用了它。我们导入的方式是from 模块名 import 函数名

指定别名

如前所述,我们经常会导入其他模块的函数来进行使用。如果相同命名的函数,当前模块已经拥有,那怎么办?这又可能会导致一些意想不到的问题。所以我们可以给导入的模块或者函数指定别名。
指定别名使用关键字as,给模块指定别名使用语法import 模块名 as 别名;给函数指定别名,使用语法from 模块名 import 函数名 as 函数别名。如下例所示:

from greet import greet_alien as ga
import greet as g


if __name__ == '__main__':
    ga("王前冲")
    g.greet_alien("王前走")

代码格式

上面章节我们介绍过,PEP 8介绍了我们编写Python代码的一些代码格式,现在我们来补充一部分。

  • 函数名只使用小写字母和下划线
  • 每个函数下应包含一个介绍函数功能的文档字符串
  • 给形参指定默认值时,等号两边不要有空格
  • 给关键字实参设置值,等号两边不要有空格
  • 一个模块内的多个函数,使用两个空行进行分开
  • import语句应该放在文件开头

おすすめ

転載: blog.csdn.net/wang465745776/article/details/122135966