Python:核心知识点整理大全15-笔记

简介: Python:核心知识点整理大全15-笔记

7.3.2 删除包含特定值的所有列表元素

在第3章中,我们使用函数remove()来删除列表中的特定值,这之所以可行,是因为要删除 的值在列表中只出现了一次。如果要删除列表中所有包含特定值的元素,该怎么办呢? 假设你有一个宠物列表,其中包含多个值为'cat'的元素。要删除所有这些元素,可不断运 行一个while循环,直到列表中不再包含值'cat',如下所示:

pets.py
pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
print(pets)
while 'cat' in pets:
 pets.remove('cat')
print(pets)

我们首先创建了一个列表,其中包含多个值为'cat'的元素。打印这个列表后,Python进入 while循环,因为它发现'cat'在列表中至少出现了一次。进入这个循环后,Python删除第一个'cat' 并返回到while代码行,然后发现'cat'还包含在列表中,因此再次进入循环。它不断删除'cat', 直到这个值不再包含在列表中,然后退出循环并再次打印列表:

['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
['dog', 'dog', 'goldfish', 'rabbit'] 

7.3.3 使用用户输入来填充字典

可使用while循环提示用户输入任意数量的信息。下面来创建一个调查程序,其中的循环每 次执行时都提示输入被调查者的名字和回答。我们将收集的数据存储在一个字典中,以便将回答 同被调查者关联起来:

mountain_poll.py
responses = {}
# 设置一个标志,指出调查是否继续
polling_active = True
while polling_active:
 # 提示输入被调查者的名字和回答
1 name = input("\nWhat is your name? ")
response = input("Which mountain would you like to climb someday? ")
 # 将答卷存储在字典中
2 responses[name] = response
 # 看看是否还有人要参与调查
3 repeat = input("Would you like to let another person respond? (yes/ no) ")
 if repeat == 'no':
 polling_active = False
# 调查结束,显示结果
print("\n--- Poll Results ---")
4 for name, response in responses.items():
 print(name + " would like to climb " + response + ".")

这个程序首先定义了一个空字典(responses),并设置了一个标志(polling_active),用于 指出调查是否继续。只要polling_active为True,Python就运行while循环中的代码。 在这个循环中,提示用户输入其用户名及其喜欢爬哪座山(见1)。将这些信息存储在字典 responses中(见2),然后询问用户调查是否继续(见3)。如果用户输入yes,程序将再次进入 while循环;如果用户输入no,标志polling_active将被设置为False,而while循环将就此结束。 最后一个代码块(见4)显示调查结果。

如果你运行这个程序,并输入一些名字和回答,输出将类似于下面这样:

What is your name? Eric
Which mountain would you like to climb someday? Denali
Would you like to let another person respond? (yes/ no) yes
What is your name? Lynn
Which mountain would you like to climb someday? Devil's Thumb
Would you like to let another person respond? (yes/ no) no
--- Poll Results ---
Lynn would like to climb Devil's Thumb.
Eric would like to climb Denali. 

7.4 小结

在本章中,你学习了:如何在程序中使用input()来让用户提供信息;如何处理文本和数字 输入,以及如何使用while循环让程序按用户的要求不断地运行;多种控制while循环流程的方式: 设置活动标志、使用break语句以及使用continue语句;如何使用while循环在列表之间移动元素, 以及如何从列表中删除所有包含特定值的元素;如何结合使用while循环和字典。 在第8章中,你将学习函数。函数让你能够将程序分成多个很小的部分,其中每部分都负责 完成一项具体任务。你可以根据需要调用同一个函数任意次,还可将函数存储在独立的文件中。 使用函数可让你编写的代码效率更高,更容易维护和排除故障,还可在众多不同的程序中重用。



第8章

函 数

8.1 定义函数

下面是一个打印问候语的简单函数,名为greet_user():

greeter.py
1 def greet_user():
2 """显示简单的问候语"""
3 print("Hello!")
4 greet_user()

这个示例演示了最简单的函数结构。1处的代码行使用关键字def来告诉Python你要定义一个 函数。这是函数定义,向Python指出了函数名,还可能在括号内指出函数为完成其任务需要什么 样的信息。在这里,函数名为greet_user(),它不需要任何信息就能完成其工作,因此括号是空 的(即便如此,括号也必不可少)。最后,定义以冒号结尾。 紧跟在def greet_user():后面的所有缩进行构成了函数体。2处的文本是被称为文档字符串 (docstring)的注释,描述了函数是做什么的。文档字符串用三引号括起,Python使用它们来生成有关程序中函数的文档。 代码行print("Hello!")(见3)是函数体内的唯一一行代码,greet_user()只做一项工作: 打印Hello!。 要使用这个函数,可调用它。函数调用让Python执行函数的代码。要调用函数,可依次指定 函数名以及用括号括起的必要信息,如4处所示。由于这个函数不需要任何信息,因此调用它时 只需输入greet_user()即可。和预期的一样,它打印Hello!:

Hello!

8.1.1 向函数传递信息

只需稍作修改,就可以让函数greet_user()不仅向用户显示Hello!,还将用户的名字用作抬 头。为此,可在函数定义def greet_user()的括号内添加username。通过在这里添加username, 就可让函数接受你给username指定的任何值。现在,这个函数要求你调用它时给username指定一 个值。调用greet_user()时,可将一个名字传递给它,如下所示:

def greet_user(username):
"""显示简单的问候语"""
 print("Hello, " + username.title() + "!")
greet_user('jesse') 

代码greet_user('jesse')调用函数greet_user(),并向它提供执行print语句所需的信息。这 个函数接受你传递给它的名字,并向这个人发出问候:

Hello, Jesse!

同样,greet_user('sarah')调用函数greet_user()并向它传递'sarah',打印Hello, Sarah!。 你可以根据需要调用函数greet_user()任意次,调用时无论传入什么样的名字,都会生成相应的 输出。

8.1.2 实参和形参

前面定义函数greet_user()时,要求给变量username指定一个值。调用这个函数并提供这种 信息(人名)时,它将打印相应的问候语。

在函数greet_user()的定义中,变量username是一个形参——函数完成其工作所需的一项信 息。在代码greet_user('jesse')中,值'jesse'是一个实参。实参是调用函数时传递给函数的信 息。我们调用函数时,将要让函数使用的信息放在括号内。在greet_user('jesse')中,将实参 'jesse'传递给了函数greet_user(),这个值被存储在形参username中。


注意 大家有时候会形参、实参不分,因此如果你看到有人将函数定义中的变量称为实参或将 函数调用中的变量称为形参,不要大惊小怪。


8.2 传递实参

鉴于函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参 的方式很多,可使用位置实参,这要求实参的顺序与形参的顺序相同;也可使用关键字实参,其 中每个实参都由变量名和值组成;还可使用列表和字典。下面来依次介绍这些方式。

8.2.1 位置实参

你调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。为此, 最简单的关联方式是基于实参的顺序。这种关联方式被称为位置实参。 为明白其中的工作原理,来看一个显示宠物信息的函数。这个函数指出一个宠物属于哪种动 物以及它叫什么名字,如下所示:

1 def describe_pet(animal_type, pet_name):
 """显示宠物的信息"""
 print("\nI have a " + animal_type + ".")
 print("My " + animal_type + "'s name is " + pet_name.title() + ".")
2 describe_pet('hamster', 'harry')

这个函数的定义表明,它需要一种动物类型和一个名字(见1)。调用describe_pet()时,需 要按顺序提供一种动物类型和一个名字。例如,在前面的函数调用中,实参'hamster'存储在形 参animal_type中,而实参'harry'存储在形参pet_name中(见2)。在函数体内,使用了这两个形 参来显示宠物的信息。

输出描述了一只名为Harry的仓鼠

I have a hamster.
My hamster's name is Harry.

1. 调用函数多次

你可以根据需要调用函数任意次。要再描述一个宠物,只需再次调用describe_pet()即可:

def describe_pet(animal_type, pet_name):
 """显示宠物的信息"""
 print("\nI have a " + animal_type + ".")
 print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet('hamster', 'harry')

第二次调用describe_pet()函数时,我们向它传递了实参'dog'和'willie'。与第一次调用时 一样,Python将实参'dog'关联到形参animal_type,并将实参'willie'关联到形参pet_name。与前 面一样,这个函数完成其任务,但打印的是一条名为Willie的小狗的信息。至此,我们有一只名 为Harry的仓鼠,还有一条名为Willie的小狗:

I have a hamster.
My hamster's name is Harry.
I have a dog.
My dog's name is Willie.

调用函数多次是一种效率极高的工作方式。我们只需在函数中编写描述宠物的代码一次,然 后每当需要描述新宠物时,都可调用这个函数,并向它提供新宠物的信息。即便描述宠物的代码 增加到了10行,你依然只需使用一行调用函数的代码,就可描述一个新宠物。 在函数中,可根据需要使用任意数量的位置实参,Python将按顺序将函数调用中的实参关联 到函数定义中相应的形参。

2. 位置实参的顺序很重要

使用位置实参来调用函数时,如果实参的顺序不正确,结果可能出乎意料:

def describe_pet(animal_type, pet_name):
 """显示宠物的信息"""
 print("\nI have a " + animal_type + ".")
 print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet('harry', 'hamster') 

在这个函数调用中,我们先指定名字,再指定动物类型。由于实参'harry'在前,这个值将 存储到形参animal_type中;同理,'hamster'将存储到形参pet_name中。结果是我们得到了一个 名为Hamster的harry:

I have a harry.
My harry's name is Hamster. 

如果结果像上面一样搞笑,请确认函数调用中实参的顺序与函数定义中形参的顺序一致。

8.2.2 关键字实参

关键字实参是传递给函数的名称—值对。你直接在实参中将名称和值关联起来了,因此向函 数传递实参时不会混淆(不会得到名为Hamster的harry这样的结果)。关键字实参让你无需考虑函 数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。

下面来重新编写pets.py,在其中使用关键字实参来调用describe_pet():

def describe_pet(animal_type, pet_name):
 """显示宠物的信息"""
 print("\nI have a " + animal_type + ".")
 print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(animal_type='hamster', pet_name='harry')

函数describe_pet()还是原来那样,但调用这个函数时,我们向Python明确地指出了各个实 参对应的形参。看到这个函数调用时,Python知道应该将实参'hamster'和'harry'分别存储在形 参animal_type和pet_name中。输出正确无误,它指出我们有一只名为Harry的仓鼠。

关键字实参的顺序无关紧要,因为Python知道各个值该存储到哪个形参中。下面两个函数调 用是等效的:

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

注意 使用关键字实参时,务必准确地指定函数定义中的形参名。

目录
相关文章
|
26天前
|
缓存 Java 索引
[Python]知识点
本文主要介绍了Python的一些高级知识点和使用细节,包括pip的使用、内置函数、列表、元组、字典、集合、变量、Lambda表达式、面向对象编程、异常处理、模块及标准库等。文章适合有一定Python基础的读者,重点在于深入理解和掌握Python的高级特性。文中还提供了大量示例代码,帮助读者更好地理解和应用这些知识点。
25 1
[Python]知识点
|
2月前
|
安全 Linux 数据安全/隐私保护
python知识点100篇系列(15)-加密python源代码为pyd文件
【10月更文挑战第5天】为了保护Python源码不被查看,可将其编译成二进制文件(Windows下为.pyd,Linux下为.so)。以Python3.8为例,通过Cython工具,先写好Python代码并加入`# cython: language_level=3`指令,安装easycython库后,使用`easycython *.py`命令编译源文件,最终生成.pyd文件供直接导入使用。
python知识点100篇系列(15)-加密python源代码为pyd文件
|
2月前
|
网络协议 数据库连接 Python
python知识点100篇系列(17)-替换requests的python库httpx
【10月更文挑战第4天】Requests 是基于 Python 开发的 HTTP 库,使用简单,功能强大。然而,随着 Python 3.6 的发布,出现了 Requests 的替代品 —— httpx。httpx 继承了 Requests 的所有特性,并增加了对异步请求的支持,支持 HTTP/1.1 和 HTTP/2,能够发送同步和异步请求,适用于 WSGI 和 ASGI 应用。安装使用 httpx 需要 Python 3.6 及以上版本,异步请求则需要 Python 3.8 及以上。httpx 提供了 Client 和 AsyncClient,分别用于优化同步和异步请求的性能。
python知识点100篇系列(17)-替换requests的python库httpx
|
2月前
|
调度 Python
python知识点100篇系列(20)-python协程与异步编程asyncio
【10月更文挑战第8天】协程(Coroutine)是一种用户态内的上下文切换技术,通过单线程实现代码块间的切换执行。Python中实现协程的方法包括yield、asyncio模块及async/await关键字。其中,async/await结合asyncio模块可更便捷地编写和管理协程,支持异步IO操作,提高程序并发性能。协程函数、协程对象、Task对象等是其核心概念。
|
2月前
|
Python Windows
python知识点100篇系列(24)- 简单强大的日志记录器loguru
【10月更文挑战第11天】Loguru 是一个功能强大的日志记录库,支持日志滚动、压缩、定时删除、高亮和告警等功能。安装简单,使用方便,可通过 `pip install loguru` 快速安装。支持将日志输出到终端或文件,并提供丰富的配置选项,如按时间或大小滚动日志、压缩日志文件等。还支持与邮件通知模块结合,实现邮件告警功能。
python知识点100篇系列(24)- 简单强大的日志记录器loguru
|
2月前
|
自然语言处理 Python Windows
python知识点100篇系列(23)- 使用stylecloud生成词云
【10月更文挑战第10天】`stylecloud` 是 `wordcloud` 的优化版,支持使用 Font Awesome 图标自定义词云形状,操作更简便。本文介绍如何安装 `jieba` 和 `stylecloud` 库,并使用它们生成中文词云。通过 `jieba` 进行分词,再利用 `stylecloud` 的 `gen_stylecloud` 方法生成具有特定形状和颜色的词云图像。
python知识点100篇系列(23)- 使用stylecloud生成词云
|
2月前
|
Java Python
> python知识点100篇系列(19)-使用python下载文件的几种方式
【10月更文挑战第7天】本文介绍了使用Python下载文件的五种方法,包括使用requests、wget、线程池、urllib3和asyncio模块。每种方法适用于不同的场景,如单文件下载、多文件并发下载等,提供了丰富的选择。
|
2月前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
2月前
|
Java Python
python知识点100篇系列(16)-python中如何获取线程的返回值
【10月更文挑战第3天】本文介绍了两种在Python中实现多线程并获取返回值的方法。第一种是通过自定义线程类继承`Thread`类,重写`run`和`join`方法来实现;第二种则是利用`concurrent.futures`库,通过`ThreadPoolExecutor`管理线程池,简化了线程管理和结果获取的过程,推荐使用。示例代码展示了这两种方法的具体实现方式。
python知识点100篇系列(16)-python中如何获取线程的返回值
|
2月前
|
Python
python知识点100篇系列(14)-分割大文件然后在合并
【10月更文挑战第2天】在工作中,因邮件附件大小限制或网络条件不佳,常需将大文件分割为小文件发送,接收后再合并。Python的文件读写功能可轻松实现此需求,也可借助第三方库filesplit简化操作。安装filesplit后,仅需几行代码即可完成文件的分割与合并,但掌握Python内置方法同样重要。