Python学习笔记 - 知识部分

本文介绍了Python的安装,包括Python环境和PyCharmIDE的下载与设置。接着,讲解了Python的基本语法,如变量、数据类型、运算符、字符串、列表、元组、字典以及循环和条件语句。文章还涉及了函数的定义、调用以及参数传递,以及类的创建和使用。最后,讨论了文件的读写操作,包括数据的持久化存储。
摘要由CSDN通过智能技术生成

本文目录

第 1 章

安装python环境(win)

  1. 下载Python并安装

链接: Python官网
直接下载最新版
要勾选这个选项后,点击第二个”自定义安装“
安装最后后有一个”Disable path length limit" 点击后选择“是”。
安装完毕,点击close关闭窗口即可

  1. 验证是否安装成功
    打开cmd,输入python回车。
    显示出Python版本即为安装成功。

下载Python IDE-PyCharm

IDE:集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。

PyCharm:PyCharm 是一款由 JetBrains 开发的高性能、跨平台的 Python IDE。它具有许多高级功能,如代码折叠、自动完成、调试、版本控制等。

链接: JetBrains官网

  1. 下载PyCharm
    链接: PyCharm下载地址
    Professional版本收费,加载Community版本。

  2. 安装插件 更改设置

  • 安装汉化插件 Plagins-Marketplace-搜索Chinese-找到简体中文语言包-安装后重启PyCharm
  • 自定义-所有设置-Python解释器-添加解释器-系统解释器-选择Python安装路径下的Python.exe
  1. 创建新工程
    打开PyCharm,点击加号创建工程。
  2. 创建.py文件
    鼠标右键点击项目目录-新建-Python文件-输入文件名-Python文件
  3. 运行代码
    右键代码输入区域-运行

第 2 章 基本语法

2.1 字面量

常用值(数据)的类型
在这里插入图片描述

2.2 注释

在程序代码中对程序代码进行解释说明的文字。
注释不会被执行,编写注释的主要目的是阐述代码要做什么,以及是如何做的。增加代码的可读性,也可以让自己在回看代码时更好的理解自己的代码。
格式:

# 我是一行注释
print("我是会被执行的代码")

""" 
多行注释
可以换行 
用三个双引号引起来
"""

2.3 变量

格式:变量名=变量值

变量的命名(函数名、类名同理)

  • Python中通常使用数字、小写字母和下划线命名,并且不要用数字打头。例:message_1。
  • 不要使用Python关键字和函数名作变量名,如print。
  • 变量名应简短且具有描述性。
  • 避免使用小写字母l和大写字母O,可能会被错认成数字1和0。
  • 避免拼写错误。

Python关键字
在这里插入图片描述

变量是标签

变量常被描述为可用于存储值的盒子。但更易于理解的定义是,变量是可以赋给值的标签,也可以说变量指向特定的值。

2.4 数据类型

  • 获取数据的类型: type()

    print(type("Axi1208"))
    print(type(123))
    print(type(11.123))
    
    # 输出结果
    <class 'str'>
    <class 'int'>
    <class 'float'>
    
  • 数据类型转换:int(x)、float(x)、str(x)
    所有数据类型都可以转为字符串,只有内容为数字的字符串可以转为数(整数、浮点数)

    # 整数转浮点数
    num1 = float(11)
    print(type(num1), num1)
    
    # 浮点数转整数 会丢失精度
    num2 = int(11.123)
    print(type(num2), num2)
    
    # 输出结果
    <class 'float'> 11.0
    <class 'int'> 11
    

2.6 运算符

2.6.1 算数运算符

在这里插入图片描述

2.6.2 赋值运算符

在这里插入图片描述

2.6.3 复合赋值运算符

在这里插入图片描述

2.7 字符串

2.7.1 定义

"This is a string."
'This is also a string.'
str = """This is a string."""

""" 
当有变量接收被三引号引起的内容时,类型为字符串
没有变量接收时,就是多行注释。
"""

# 当字符串中包含单引号、双引号时,可以用反斜杠转义
name = "\"hello"
print(name) 
# 输出结果: "hello

2.7.2 字符串拼接

  • 简单拼接
    通过“+”号连接字符串变量或字符串字面量。
    注:无法和非字符串类型进行拼接。

  • 在字符串中使用变量
    在前引号前加上字母f,再将要插入的变量放入花括号内。

    first_name = "ada"
    last_name = "lovelace"
    full_name = f"{first_name} {last_name}"
    print(full_name)
    
    # 输出结果
    ada lovelace
    

    f字符串还可以复合使用

    first_name = "ada"
    last_name = "lovelace"
    full_name = f"{first_name} {last_name}"
    print(f"Hello, {full_name.title()}!")
    
    #输出结果
    Hello, Ada Lovelace!
    

    还可以使用f字符串来创建消息,再把整条消息赋给变量

    first_name = "ada"
    last_name = "lovelace"
    full_name = f"{first_name} {last_name}"
    message = f"Hello, {full_name.title()}!"
    print(message)
    
    #输出结果
    Hello, Ada Lovelace!
    
  • 使用%进行拼接

2.7.3 一些方法

修改字符串的大小写
name = "Ada Lovelace"
print(name.upper())
print(name.lower())
print(name.title()) # 所有单词首字母大写,其余字母小写。
# 输出结果
DA LOVELACE
ada lovelace
转义符

1.\n:换行
2.\t:制表符
3.\r:覆盖
4.\b:删除
5.:两个反斜杠表示一个
6.原字符:使转义字符不起作用,写在前面,用r或R
示例1:

print("我的名字叫"AXI"") # 报错

正解:

print("我的名字叫\"AXI\"") # 我的名字叫"AXI"

示例1、2

print("我的名字叫""AXI") # 我的名字叫 AXI

print("我的名字叫\n""AXI") # 我的名字叫
						    # AXI

print("我的名字叫\t""AXI") # 我的名字叫    AXI

示例3

print("hello\rpython") # python 把\r后面的内容覆盖\r前面的内容

示例4

print("hello\bpython") # hellpython \b等于键盘backspace

示例5

print("\\") # \ 写两个斜杠代表一个斜杠

示例6

print(r"我的名字叫\n""AXI") # 我的名字叫\nAXI
删除空白

– 删除末尾空白 rstrip()
– 删除开头空白 lstrip()
– 删除首尾空白 strip()
以上方法都不会改变原字符串。

2.8 数

2.8.1 整数(int)

在Python中,可对整数执行加(+ )减(- )乘(* )除(/ )运算。
在终端会话中,Python直接返回运算结果。Python使用两个乘号表示乘方运算:

>>> 3 ** 2
9
>>> 3 ** 3
27
>>> 10 ** 6
1000000

2.8.2 浮点数(float)

Python将所有带小数点的数称为浮点数 。
与其他语言相似,浮点数运算存在一些精度问题。

2.8.3 整数和浮点数

将任意两个数相除时,结果总是浮点数,即便这两个数都是整数且能整除:

>>> 4/2
2.0

在其他任何运算中,如果一个操作数是整数,另一个操作数是浮点数,结果也总是浮点数:

>>> 1 + 2.0
3.0
>>> 2 * 3.0
6.0
>>> 3.0 ** 2
9.0

无论是哪种运算,只要有操作数是浮点数,Python默认得到的总是浮点数,即便结果原本为整数也是如此。

2.8.4 数中的下划线

当书写很大的数时,可以用下划线将数字进行分组。但对于Python而言,储存时1000和1_000没有什么不同。这种表示法适用于整数和浮点数,但只有Python 3.6和更高的版本支持。

2.8.5 常量

常量 类似于变量,但其值在程序的整个生命周期内保持不变。Python没有内置的常量类型,但Python程序员会使用全大写来指出应将某个变量视为常量,其值应始终不变:
在代码中,要指出应将特定的变量视为常量,可将其字母全部大写。

2.9 数据输入

print(),可以将内容输出。
与之对应,Python中还有一个input语句,用来获取键盘输入。

print("你叫什么名字?")
name = input()
print(f"你好,{name}!")

当程序输出“你叫什么名字?”后,可以键入内容。并且将其值赋给name变量,并继续执行下一条语句。
函数input() 接受一个参数——要向用户显示的提示(prompt)或说明,让用户知道该如何做。

name = input("你叫什么名字?")
print(f"你好,{name}!")

获取的内容默认为字符串,可以用方法转换数据类型。

第 3 章 列表

3.1 列表是什么

列表 由一系列按特定顺序排列的元素组成。你可以创建包含字母表中所有字母、数字0~9或所有家庭成员姓名的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。列表通常包含多个元素,因此给列表指定一个表示复数的名称(如letters 、digits或names )是个不错的主意。
在Python中,用方括号([] )表示列表,并用逗号分隔其中的元素。下面是一个简单的列表示例:

bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles) 
# ['trek', 'cannondale', 'redline', 'specialized']

3.1.1 访问列表元素

列表是有序集合,因此要访问列表的任意元素,通过索引访问即可。

bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[0])
# trek

索引 由0开始。Python中将索引指定为-1,可以返回最后一个列表元素。-2为倒数第二个元素,以此类推。

bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[-1])
# specialized

3.1.2 使用列表中的值

你可以像使用其他变量一样使用列表中的各个值。例如,可以使用f字符串根据列表中的值来创建消息。

bicycles = ['trek', 'cannondale', 'redline', 'specialized']
message = f"My first bicycle was a {bicycles[0].title()}."
print(message)
# My first bicycle was a Trek.

3.2 修改、添加和删除元素

3.2.1 在列表中添加元素

  • 在末尾添加元素: append()

    motorcycles = []
    motorcycles.append('honda')
    motorcycles.append('yamaha')
    motorcycles.append('suzuki')
    print(motorcycles)
    # ['honda', 'yamaha', 'suzuki']
    
  • 在列表中插入元素:insert()

    motorcycles = ['honda', 'yamaha', 'suzuki']
    motorcycles.insert(0, 'ducati')
    print(motorcycles)
    # ['ducati', 'honda', 'yamaha', 'suzuki']
    

    第一个参数表示插入的位置(索引),
    第二个参数表示插入的值。

3.2.2 从列表中删除元素

  • 通过索引删除元素:del()

    motorcycles = ['honda', 'yamaha', 'suzuki']
    print(motorcycles)
    
    del motorcycles[0]
    print(motorcycles)
    
    # ['honda', 'yamaha', 'suzuki']
    # ['yamaha', 'suzuki']
    

    该方法返回处理后的列表。

  • 弹出元素:pop()

    motorcycles = ['honda', 'yamaha', 'suzuki']
    print(motorcycles)
    
    popped_motorcycle = motorcycles.pop()
    print(motorcycles)
    print(popped_motorcycle)
    
    # ['honda', 'yamaha', 'suzuki']
    # ['honda', 'yamaha']
    # suzuki
    

    该方法返回“被弹出”的值。
    如果不填入参数,则弹出列表最后一个元素;
    若填入索引,pop()方法可以弹出列表任意位置的元素。

    motorcycles = ['honda', 'yamaha', 'suzuki']
    first_owned = motorcycles.pop(0)
    print(f"The first motorcycle I owned was a {first_owned.title()}.")
    # The first motorcycle I owned was a Honda.
    
  • 根据值删除元素:remove()

    motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']
    print(motorcycles)
    
    motorcycles.remove('ducati')
    print(motorcycles)
    
    # ['honda', 'yamaha', 'suzuki', 'ducati']
    # ['honda', 'yamaha', 'suzuki']
    

    注:方法remove() 只删除第一个指定的值。如果要删除的值可能在列表中出现多次,就需要使用循环来确保将每个值都删除。

3.3 组织列表

3.3.1 使用sort()对列表永久排序

cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.sort()
print(cars)

# ['audi', 'bmw', 'subaru', 'toyota']

3.3.2 使用函数sorted() 对列表临时排序

cars = ['bmw', 'audi', 'toyota', 'subaru']
print("这是原本的列表:")
print(cars)

print("\n这是临时排序过的列表:")
print(sorted(cars))

print("\n这是原本的列表:")
print(cars)

# 输出结果
这是原本的列表:
['bmw', 'audi', 'toyota', 'subaru']
这是临时排序过的列表:
['audi', 'bmw', 'subaru', 'toyota']
这是原本的列表:
['bmw', 'audi', 'toyota', 'subaru']

也就是说,sorted()方法不改变原列表。

3.3.3 永久倒序列表 reverse()

cars = ['bmw', 'audi', 'toyota', 'subaru']
print(cars)

cars.reverse()
print(cars)

# ['bmw', 'audi', 'toyota', 'subaru']
# ['subaru', 'toyota', 'audi', 'bmw']

3.3.4 获取列表的长度 len()

cars = ['bmw', 'audi', 'toyota', 'subaru']
print(len(cars))
# 4

第 4 章 操作列表

4.1 遍历列表

通过for循环

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(magician)

# 输出结果
alice
david
carolina

刚开始使用循环时请牢记,对列表中的每个元素,都将执行循环指定的步骤,而不管列表包含多少个元素。如果列表包含一百万个元素,Python就重复执行指定的步骤一百万次,且通常速度非常快。
另外,编写for 循环时,可以给依次与列表中每个值相关联的临时变量指定任意名称。然而,选择描述单个列表元素的有意义名称大有裨益。例如,对于小猫列表、小狗列表和一般性列表,像下面这样编写for 循环的第一行代码是不错的选择:

for cat in cats:
for dog in dogs:
for item in list_of_items:

4.1.2 在for 循环中执行更多操作

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(f"{magician.title()}, that was a great trick!")
    print(f"I can't wait to see your next trick, {magician.title()}")
    
# 输出结果
Alice, that was a great trick!
I can't wait to see your next trick, Alice
David, that was a great trick!
I can't wait to see your next trick, David
Carolina, that was a great trick!
I can't wait to see your next trick, Carolina

注意 在for循环中的语句都要进行缩进。第一行不缩进会产生报错。
若想退出for循环,在for循环的下一个语句不缩进即可。

4.3 创建数值列表

列表非常适合用于存储数字集合,而Pythonᨀ供了很多工具,可帮助你高效地处理数字列表。

4.3.1 range()

Python函数range() 让你能够轻松地生成一系列数。

for value in range(1, 5):
    print(value)
# 输出结果
1
2
3
4

4.3.2 使用range() 创建数字列表

numbers = list(range(1, 6))
print(numbers)
# [1, 2, 3, 4, 5]

第一个参数为初始值,
第二个参数为终值(不包含),
还有第三个参数,为步长。

# 打印1~10的偶数
even_numbers = list(range(2, 11, 2))
print(even_numbers)
# [2, 4, 6, 8, 10]

4.3.3 对数字列表执行简单的统计计算

  • min() 找到列表的最小值
  • max() 找到列表的最大值
  • sum() 求出列表值的总和

4.3.4 列表解析

创建平方数列表最朴实的写法:

squares = []
for value in range(1,11):
    squares.append(value**2)
print(squares)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

使用列表解析可以简化为:

squares = [value**2 for value in range(1, 11)]
print(squares)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

4.4 使用列表的一部分

处理列表的部分元素,Python称之为切片。

4.4.1 切片

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[0:3])
# ['charles', 'martina', 'michael']

listname[初始索引:结束索引(不包含)]
若没有指定初始索引,则从列表开头开始。
没有指定结束索引,则切片到末尾。
如果想输出列表末尾几个元素,可以使用负数索引,如player[-3:],一直代表列表最后个元素。

4.4.2 复制列表

切片是获取部分或全部列表,并返回一个浅拷贝
因此,当你想复制列表可以这样做:

my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:]

my_foods.append('cannoli')
friend_foods.append('ice cream')

print("My favorite foods are:")
print(my_foods)

print("\nMy friend's favorite foods are:")
print(friend_foods)

# 输出结果
My favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli']

My friend's favorite foods are:
['pizza', 'falafel', 'carrot cake', 'ice cream']

4.5 元组

有时候你需要创建一系列不可修改的元素,元组可以满足这种需求。Python将不能修改的值称为不可变的 ,而不可变的列表被称为元组

4.5.1 定义元组

元组看起来很像列表,但使用圆括号而非中括号来标识。定义元组后,就可使用索引来访问其元素,就像访问列表元素一样。

dimensions = (200, 50)
print(dimensions[0])
print(dimensions[1])

# 输出结果
200
50

若试图修改元组中的值,会报错。
严格地说,元组是由逗号标识的,圆括号只是让元组看起来更整洁、更清晰。如果你要定义只包含一个元素的元组,必须在这个元素后面加上逗号:

my_t = (3,)

4.5.2 修改元组变量

无法修改元组的元素,但可以给存储元组的变量赋值。

第 5 章 if语句

5.1 简单示例

cars = ['audi', 'bmw', 'subaru', 'toyota']

for car in cars:
    if car == 'bmw':
        print(car.upper())
    else:
        print(car.title())
        
# 输出结果
Audi
BMW
Subaru
Toyota

5.2 条件测试

5.2.1 比较运算符

在这里插入图片描述

5.2.2 检查是否相等时忽略大小写

在Python使用相等运算符时是大小写敏感的,若想忽略大小写可以使用lower()方法处理后再比较。并且lower()也不会修改原本的变量。

5.2.3 检查多个条件

使用 andor 连接条件。
使用and时,条件都满足才返回True,
使用or时,只要有一个条件满足则为True。

5.2.4 检查特定值是否包含在列表中

使用 in

>>> requested_toppings = ['mushrooms', 'onions', 'pineapple']
>>> 'mushrooms' in requested_toppings
True
>>> 'pepperoni' in requested_toppings
False

使用 not in 可以检查特定值是否不包含在列表中。

5.3 if语句

5.3.1 简单的if语句

if conditional_test:
    do something

与for循环语句相同,if内的语句要缩进。

5.3.2 if-else 语句

age = 17if age >= 18:
    print("You are old enough to vote!")
    print("Have you registered to vote yet?")else:
    print("Sorry, you are too young to vote.")
	print("Please register to vote as soon as you turn 18!")

# 输出结果
Sorry, you are too young to vote.
Please register to vote as soon as you turn 18!

5.3.3 if-elif-else 结构

在现实世界中,很多情况下需要考虑的情形超过两个。例如,来看一个根据年龄段收费的游乐场:

  • 4岁以下免费;
  • 4~18岁收费25美元;
  • 18岁(含)以上收费40美元。

如果只使用一条if 语句,该如何确定门票价格呢?下面的代码确定一个人所属的年龄段,并打印一条包含门票价格的消息:

age = 12
if age < 4:
	print("Your admission cost is $0.")
elif age < 18:
	print("Your admission cost is $25.")
else:
	print("Your admission cost is $40.")
# Your admission cost is $25.

当有一个条件满足时,代码块就会被执行。剩下的代码块会被跳过。
可根据需要使用任意数量的elif 代码块。
Python并不要求if-elif 结构后面必须有else 代码块。有些情形下可以省略else代码块。

第 6 章 字典

Python中的字典可以将相关信息关联起来,并且可储存的信息量极狐不受限制。

6.1 简单示例

来看一个包含外星人的游戏,这些外星人的颜色和分数各不相同。
下面是一个简单的字典,存储了有关特定外星人的信息:

alien_0 = {'color': 'green', 'points': 5}
print(alien_0['color'])
print(alien_0['points'])

# 输出结果
green
5

6.2 使用字典

在Python中,字典 是一系列键值对 。每个键 都与一个值相关联,你可使用键来访问相关联的值。与键相关联的值可以是数、字符串、列表乃至字典。事实上,可将任何Python对象用作字典中的值。

在Python中,字典用放在花括号({} )中的一系列键值对表示,如前面的示例所示。

6.2.1 访问字典中的值

alien_0 = {'color': 'green'}
print(alien_0['color'])
# green

6.2.2 添加键值对

6.2.2 增改删查

  • 字典名['新键名'] = 对应的值
    

注 字典中元素的排列顺序和定义时相同。

  • 字典名['已存在的键'] = 新值
    
  • 删 del

    del 字典名['指定键']
    
  • 查 访问值
    – 通过键名访问

    print(字典名['指定键'])
    

    查找不到的时候会报错。

    – 通过get()访问

    alien_0 = {'color': 'green', 'speed': 'slow'}
    point_value = alien_0.get('points', 'No point value assigned.')
    print(point_value)
    # No point value assigned.
    

    第一个参数为指定键名,
    第二个参数为指定的键不存在时要返回的值,是可选的。

6.3 遍历字典

6.3.1 遍历所有键值对

与列表类似

user_0 = {
	'username': 'efermi',
	'first': 'enrico',
	'last': 'fermi',
	}
for key, value in user_0.items():
	print(f"\nKey: {key}")
	print(f"Value: {value}")
	
# 输出结果
Key: username
Value: efermi

Key: first
Value: enrico

Key: last
Value: fermi

要编写遍历字典的for 循环,可声明两个变量,用于存储键值对中的键和值。这两个变量可以使用任意名称。
for 语句的第二部分包含字典名和方法items() ,它返回一个键值对列表。

6.3.2 遍历字典中的所有键

favorite_languages = {
	'jen': 'python',
	'sarah': 'c',
	'edward': 'ruby',
	'phil': 'python',
	}
for name in favorite_languages.keys():
	print(name.title())
	
# 输出结果
Jen
Sarah
Edward
Phil

其中方法keys()可以省略。方法keys() 并非只能用于遍历:实际上,它返回一个列表,其中包含字典中的所有键。

6.3.3 遍历字典中的所有值

将keys()替换为**values()**即可。
这种做法提取字典中所有的值,而没有考虑是否重复。为剔除重复项,可使用集合(set)。集合 中的每个元素都必须是独一无二的:

 for language in set(favorite_languages.values()):
	print(language.title())

注意 可使用一对花括号直接创建集合,并在其中用逗号分隔元素。集合和字典很容易混淆,因为它们都是用一对花括号定义的。当花括号内没有键值对时,定义的很可能是集合。不同于列表和字典,集合不会以特定的顺序存储元素。

第 7 章 while循环

for 循环用于针对集合中的每个元素都执行一个代码块,而while循环则不断运行,直到指定的条件不满足为止

7.1 使用while 循环

current_number = 1
while current_number <= 5:
	print(current_number)
	current_number += 1

7.1.1 让用户选择何时退出

prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
message = ""
while message != 'quit':
	message = input(prompt)
	if message != 'quit':
		print(message)

7.1.2 flag

在要求很多条件都满足才继续运行的程序中,可定义一个变量,用于判断整个程序是否处于活动状态。这个变量称为标志 (flag),充当程序的交通信号灯。可以让程序在标志为True 时继续运行,并在任何事件导致标志的值为False 时让程序停止运行。这样,在while 语句中就只需检查一个条件:标志的当前值是否为True。然后将所有其他测试(是否发生了应将标志设置为False 的事件)都放在其他地方,从而让程序更整洁。

7.1.3 使用break退出循环

要立即退出while 循环,不再运行循环中余下的代码,也不管条件测试的结果如何,可使用 break 语句。

prompt = "\nPlease enter the name of a city you have visited:"
prompt += "\n(Enter 'quit' when you are finished.) "
while True:
	city = input(prompt)
	if city == 'quit':
		break
	else:
		print(f"I'd love to go to {city.title()}!")

# 输出
Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) New York
I'd love to go to New York!

Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) quit

注意任何Python循环中都可使用break 语句。例如,可使
用break 语句来退出遍历列表或字典的for 循环。

7.2.4 在循环中使用continue

返回循环开头 ,并根据条件测试结果决定是否继续执行循环,可使用 continue 语句,它不像break 语句那样不再执行余下的代码并退出整个循环。

current_number = 0
while current_number < 10:
	current_number += 1
	if current_number % 2 == 0:
		continue
	print(current_number)

7.2.5 避免无限循环

如果程序陷入无限循环,可按Ctrl + C,也可关闭显示程序输出的终端窗口。确认程序至少有一个这样的地方能让循环条件为False ,或者让 break 语句得以执行。

7.3 使用while循环处理列表和字典

for 循环是一种遍历列表的有效方式,但不应在for 循环中修改列表,否则将导致Python难以跟踪其中的元素。要在遍历列表的同时对其进行修改,可使用while 循环。通过将while 循环同列表和字典结合起来使用,可收集、存储并组织大量输入,供以后查看和显示。

7.3.1 在列表之间移动元素

有一个包含未验证用户的列表,在验证后将其添加到已验证用户列表中:

# 首先,创建一个待验证用户列表
# 和一个用于存储已验证用户的空列表。
unconfirmed_users = ['alice', 'brian', 'candace']
confirmed_users = []
# 验证每个用户,直到没有未验证用户为止。
# 将每个经过验证的用户都移到已验证用户列表中。
while unconfirmed_users:
	current_user = unconfirmed_users.pop()
	print(f"Verifying user: {current_user.title()}")
	confirmed_users.append(current_user)
# 显示所有已验证的用户。
print("\nThe following users have been confirmed:")
for confirmed_user in confirmed_users:
	print(confirmed_user.title())
	
# 输出结果
Verifying user: Candace
Verifying user: Brian
Verifying user: Alice

The following users have been confirmed:
Candace
Brian
Alice

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

remove()与while结合使用

pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
print(pets)

while 'cat' in pets:
	pets.remove('cat')
print(pets)

# 输出结果
['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
['dog', 'dog', 'goldfish', 'rabbit']

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

可使用while 循环ᨀ示用户输入任意多的信息。例如对用户的年龄进行调查:

responses = {}
# 设置一个标志,指出调查是否继续。
polling_active = True
while polling_active:
	# 提示输入被调查者的名字和回答。
	name = input("\n你叫什么名字?")
	response = input("你今年多大了?")
	# 将回答存储在字典中。
	responses[name] = response
	# 看看是否还有人要参与调查。
	repeat = input("还有需要调查的人吗? (yes/ no) ")
	if repeat == 'no':
		polling_active = False
# 调查结束,显示结果。
print("\n--- Poll Results ---")
for name, response in responses.items():
	print(f"{name}今年{response}岁了。")

# 输出结果
你叫什么名字?AXI
你今年多大了?23
还有需要调查的人吗? (yes/ no) yes

你叫什么名字?小明的爷爷
你今年多大了?99
还有需要调查的人吗? (yes/ no) no

--- Poll Results ---
AXI今年23岁了。
小明的爷爷今年99岁了。

第 8 章 函数

函数是带名字的代码块,用于完成具体的工作。要执行函数定义的特定任务,可调用 该函数。需要在程序中多次执行同一项任务时,无须反复编写完成该任务的代码,只需要调用执行该任务的函数,让Python运行其中的代码即可。你将发现,通过使用函数,程序编写、阅读、测试和修复起来都更加容易。

8.1 定义函数

def greet_user():"""显示简单的问候语。"""print("Hello!")
❹ greet_user()

❶ 使用 def 函数名(): 定义函数
紧跟在def greet_user(): 后面的所有缩进行构成了函数体。
❷ 文本是称为文档字符串 (docstring)的注释,描述了函数是做什么的。
❸ 代码行print(“Hello!”) 是函数体内的唯一一行代码,
因此greet_user() 只做一项工作:打印Hello! 。
❹ 由于这个函数不需要任何信息,调用它时只需输入greet_user() 即可。和预期一样,它打印Hello! :

Hello!

8.1.1 参数

在函数名后面的括号中添加参数名,就可以让函数接受指定的任何值。

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

# Hello, Jesse!

8.1.2实参和形参

在函数 greet_user() 的定义中,变量 username 是一个形参(parameter),即函数完成工作所需的信息。在代码 greet_user(‘jesse’) 中,值 ‘jesse’ 是一个实参(argument),即调用函数时传递给函数的信息。
在greet_user(‘jesse’)中,将实参 ‘jesse’ 传递给了函数greet_user() ,这个值被赋给了形参username。

8.2 传递实参

  1. 位置实参
    按照形参的位置直接传入内容。

  2. 关键字形参
    传递给函数的名称值对。
    例:

    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(animal_type='hamster', pet_name='harry')
    

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

8.2.3 默认值

可以在定义函数形参时设定默认值。当调用函数时,未传入实参,则使用默认值作为实参。

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')

# 输出结果
I have a dog.
My dog's name is Willie.

注意 使用默认值时,必须先在形参列表中列出没有默认值的形参,再列出有默认值的实参。这让Python依然能够正确地解读位置实参。
也就是说 先列出必填的参数,再列出可选的参数。

8.3 返回值

函数并非总是直接显示输出,它还可以处理一些数据,并返回一个或一组值。函数返回的值称为返回值。在函数中,可使用return语句将值返回到调用函数的代码行。

8.3.1 例子

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()
	
musician = get_formatted_name('jimi', 'hendrix')
print(musician)

musician = get_formatted_name('john', 'hooker', 'lee')
print(musician)

# 输出结果
Jimi Hendrix
John Lee Hooker

8.4 传递任意数量的实参

Python允许函数从调用语句中收集任意数量的实参。
例:

def user_info(*users):
    """打印用户名"""
    print(users)

user_info('mike')
user_info('tom', 'peter', 'lee')

# 输出结果
('mike',)
('tom', 'peter', 'lee')

形参名*users中的星号让Python创建一个名为users的空元组,并将收到的所有值都封装到这个元组中。函数体内的函数调用print() 通过生成输出,注意,Python将实参封装到一个元组中,即便函数只收到一个值。

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

8.5 将函数存储在模块中

将函数存储在称为模块 的独立文件中,再将模块导入 到主程序中。提升代码的可复用性,使开发者更专注于高层逻辑。

8.5.1 导入整个模块

import python文件名

import module_name

# 使用
module_name.function_name()

8.5.2 导入特定的函数

from python文件名 import 函数名

from module_name import function_0, function_1, function_2

# 使用
function_name()

8.5.3 使用as 给函数指定别名

from python文件名 import 函数名 as 别名

from module_name import function_name as fn
fn()

8.5.4 使用as 给模块指定别名

import module_name as mn

8.6.5 导入模块中的所有函数

from module_name import *

第 9 章 类

面向对象编程 是最有效的软件编写方法之一。在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。编写类时,你定义一大类对象都有的通用行为。基于类创建对象 时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。
根据类来创建对象称为实例化 ,这让你能够使用类的实例。

9.1 创建和使用类

使用类几乎可以模拟任何东西。下面来编写一个表示小狗的简单类Dog ,它表示的不是特定的小狗,而是任何小狗。对于大多数宠物狗,我们都知道些什么呢?它们都有名字和年龄。我们还知道,大多数小狗还会蹲下和打滚。由于大多数小狗都具备上述两项信息(名字和年龄)和两种行为(蹲下和打滚),我们的Dog 类将包含它们。这个类让Python知道如何创建表示小狗的对象。编写这个类后,我们将使用它来创建表示特定小狗的实例。

9.1.1 创建Dog 类

根据Dog 类创建的每个实例都将存储名字和年龄,我们赋予了每条
小狗蹲下(sit() )和打滚(roll_over() )的能力:

class Dog:
    """一次模拟小狗的简单尝试。"""
    
    def __init__(self, name, age):
        """初始化属性name和age。"""
        self.name = name
        self.age = age
        
    def sit(self):
        """模拟小狗收到命令时蹲下。"""
        print(f"{self.name} is now sitting.")
        
    def roll_over(self):
        """模拟小狗收到命令时打滚。"""
        print(f"{self.name} rolled over!")

在Python中,首字母大写的名称指的是类。
方法__init__()
类中的函数称为方法。init() 是一个特殊方法,每当你根据Dog 类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。两侧有两个下划线的方法会被自动调用。
我们将方法__init__() 定义成包含三个形参:self 、name 和age 。在这个方法的定义中,形参self 必不可少,而且必须位于其他形参的前面。
Python调用这个方法来创建Dog 实例时,将自动传入实参self 。每个与实例相关联的方法调用都自动传递实参self ,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
每当根据Dog 类创建实例时,都只需给最后两个形参(name和age )提供值。
以self 为前缀的变量可供类中的所有方法使用,可以通过类的任何实例来访问。

9.1.2 根据类创建实例

下面来创建一个表示特定小狗的实例:

class Dog:
	--snip--
	
my_dog = Dog('Willie', 6)

print(f"My dog's name is {my_dog.name}.")
print(f"My dog is {my_dog.age} years old.")
my_dog.sit()
my_dog.roll_over()

# 输出结果
My dog's name is Willie.
My dog is 6 years old.
Willie is now sitting.
Willie rolled over!

9.2 使用类和实例

9.2.1 修改属性的值

我们能以三种方式修改属性的值:直接通过实例进行修改,通过方法进行设置,以及通过方法进行递增(增加特定的值)。下面依次介绍这些方式。

  • 直接修改属性的值
    实例名.属性名 = 新值
  • 通过方法进行设置
    实例名.类中的方法(新值)
  • 以及通过方法进行递增(增加特定的值)
    在类的方法中接受参数并进行递增。

9.3 继承

编写类时,并非总是要从空白开始。如果要编写的类是另一个现成类的特殊版本,可使用继承 。一个类继承 另一个类时,将自动获得另一个类的所有属性和方法。原有的类称为父类 ,而新类称为子类 。子类继承了父类的所有属性和方法,同时还可以定义自己的属性和方法。

9.3.1 子类的方法__init__()

在既有类的基础上编写新类时,通常要调用父类的方法__init__() 。这将初始化在父类__init__() 方法中定义的所有属性,从而让子类包含这些属性。

class Car:
	--snip--

class ElectricCar(Car):
	"""电动汽车的独特之处。"""
	def __init__(self, make, model, year):
	"""
	初始化父类的属性。
	再初始化电动汽车特有的属性。
	"""
	super().__init__(make, model, year) # 关键句
	self.battery_size = 75 # 特有

	def describe_battery(self):
		"""打印一条描述电瓶容量的消息。"""
		print(f"This car has a {self.battery_size}-kWh battery.")

my_tesla = ElectricCar('tesla', 'model s', 2019)
print(my_tesla.get_descriptive_name()) # 子类的方法
my_tesla.describe_battery() # 父类的方法

super() 是一个特殊函数,让你能够调用父类的方法。这行代码让Python调用Car 类的方法__init__() ,让ElectricCar 实例包含这个方法中定义的所有属性。父类也称为超类(superclass),名称super 由此而来。

9.3.2 重写父类的方法

在子类中可以重写父类中的方法。即重新定义一次,定义后也是子类特有的方法。

9.3.3 将实例用作属性

使用代码模拟实物时,你可能会发现自己给类添加的细节越来越多:属性和方法清单以及文件都越来越长。在这种情况下,可能需要将类的一部分提取出来,作为一个独立的类。可以将大型类拆分成多个协同工作的小类。
例如,不断给ElectricCar 类添加细节时,我们可能发现其中包
含很多专门针对汽车电瓶的属性和方法。在这种情况下,可将这些
属性和方法ᨀ取出来,放到一个名为Battery 的类中,并将一
个Battery 实例作为ElectricCar 类的属性:

class Car:
	--snip--

class Battery:
	"""一次模拟电动汽车电瓶的简单尝试。"""
	def __init__(self, battery_size=75):
		"""初始化电瓶的属性。"""
		self.battery_size = battery_size
	def describe_battery(self):
		"""打印一条᧿述电瓶容量的消息。"""
		print(f"This car has a {self.battery_size}-kWh battery.")
		
class ElectricCar(Car):
	"""电动汽车的独特之处。"""
	def __init__(self, make, model, year):
		"""
		初始化父类的属性。
		再初始化电动汽车特有的属性。
		"""
		super().__init__(make, model, year)
		self.battery = Battery() #关键句
		
my_tesla = ElectricCar('tesla', 'model s', 2019)

print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()

9.4 导入类

Python允许将类存储在模块中,然后在主程序中导入所需的模块。

9.4.1 导入单个类

from module_name import class_name

9.4.2 在一个模块中存储多个类

虽然同一个模块中的类之间应存在某种相关性,但可根据需要在一个模块中存储任意数量的类。

9.4.3 从一个模块中导入多个类

from module_name import class_name1, class_name2

9.4.4 导入整个模块

import module_name
my_instance = module_name.class_name()

9.4.5 导入模块中的所有类

from module_name import *

**不推荐这种方式。**需要从一个模块中导入很多类时,最好导入整个模块,并使用module_name.ClassName 语法来访问类。这样做时,虽然文件开头并没有列出用到的所有类,但你清楚地知道在程序的哪些地方使用了导入的模块。这也避免了导入模块中的每个类可能引发的名称冲突。

9.4.6 使用别名

from electric_car import ElectricCar as EC

9.5 Python标准库

要了解Python标准库,Python Module of the Week是个不错的网站。请访问该网站并查看其中的目录,找一个你感兴趣的模块进行探索。
链接: Python Module of the Week

第 10 章 文件

10.1 从文件中读取数据

要使用文本文件中的信息,首先需要将信息读取到内存中。为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。

10.1.1 读取整个文件

例:
pi_digits.txt

3.1415926535
  8979323846
  2643383279

下面的程序打开并读取这个文件,再将其内容显示到屏幕上:
file_reader.py

with open('pi_digits.txt') as file_object:
	contents = file_object.read()
print(contents)

  • 函数 open() 接受一个参数:要打开的文件的名称。Python在当前执行的文件所在的目录中查找指定的文件。
  • 关键字 with 在不再需要访问文件后将其关闭。而非使用close()。使用close()方法可能会导致意外的数据丢失或受损。所以只管打开文件即可,Python会在合适的时候自动关闭。
  • 使用方法 read() 读取这个文件的全部内容。
    read() 到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个行。要删除多出来的空行,可在函数调用print() 中使用rstrip()

10.1.2 文件路径

  • 相对文件路径
with open('text_files/filename.txt') as file_object:

这行代码让Python到文件夹python_work下的文件夹text_files中去查找指定的.txt文件。
注意 显示文件路径时,Windows系统使用反斜杠(\ )而不是斜杠(/ ),但在代码中依然可以使用斜杠。

  • 绝对文件路径
file_path = '/home/ehmatthes/other_files/text_files/_filename_.txt'
with open(file_path) as file_object:

注意 如果在文件路径中直接使用反斜杠,将引发错误,因为反斜杠用于对字符串中的字符进行转义。例如,对于路径"C:\path\to\file.txt" ,其中的\t 将被解读为制表符。
如果一定要使用反斜杠,可对路径中的每个反斜杠都进行转义,如"C:\path\to\file.txt" 。

10.1.3 逐行读取

要以每次一行的方式检查文件,可对文件对象使用for 循环:
file_reader.py

filename = 'pi_digits.txt'
with open(filename) as file_object:
	for line in file_object:
		print(line)
# 结果
3.1415926535

  8979323846
  
  2643383279
  

可以发现,相较于原文件,每一行后都多了一行空白。可以使用rstrip()消除。

10.1.4 创建一个包含文件各行内容的列表

filename = 'pi_digits.txt'
with open(filename) as file_object:
	lines = file_object.readlines()
for line in lines:
	print(line.rstrip())

方法 readlines() 从文件中读取每一行,并将其存储在一个列表中。接下来,该列表被赋给变量lines 。在 with 代码块外,依然可使用这个变量。

10.2 写入文件

10.2.1 写入空文件

要将文本写入文件,你在调用open() 时需要ᨀ供另一个实参,告诉Python你要写入打开的文件。

filename = 'programming.txt'
with open(filename, 'w') as file_object:
	file_object.write("I love programming.")

调用open() 时ᨀ供了两个实参。第一个实参也是要打开的文件的名称。第二个实参(‘w’ )告诉Python,要以 写入模式 打开这个文件。打开文件时,可指定读取模式 (‘r’)写入模式 (‘w’ )附加模式 (‘a’ )读写模式 (‘r+’)。如果省略了模式实参,Python将以默认的只读模式打开文件。
如果要写入的文件不存在,函数open() 将自动创建它。然而,以写入模式(‘w’ )打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件的内容。
使用文件对象的方法 write() 将一个字符串写入文件。

注意 Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str() 将其转换为字符串格式。

10.2.2 写入多行

要让每个字符串都单独占一行,需要在方法调用write() 中包含换行符:

filename = 'programming.txt'
with open(filename, 'w') as file_object:
	file_object.write("I love programming.\n")
	file_object.write("I love creating new games.\n")

像显示到终端的输出一样,还可以使用空格、制表符和空行来设置这些输出的格式。

10.2.3 附加到文件

如果要给文件添加内容,而不是覆盖原有的内容,可以以附加模式打开文件。以附加模式打开文件时,Python不会在返回文件对象前清空文件的内容,而是将写入文件的行添加到文件末尾。如果指定的文件不存在,Python将为你创建一个空文件。

with open(filename, 'a') as file_object:

10.3 存储数据

模块 json 让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。你还可以使用json 在Python程序之间分享数据。更重要的是,JSON数据格式并非Python专用的,这让你能够将以JSON格式存储的数据与使用其他编程语言的人分享。这是一种轻便而有用的格式,也易于学习。
注意 JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被包括Python在内的众多语言采用。

10.3.1 使用json.dump() 和json.load()

函数json.dump() 接受两个实参:要存储的数据,以及可用于存储数据的文件对象。下面演示了如何使用json.dump() 来存储数字列表

import json

numbers = [2, 3, 5, 7, 11, 13]

filename = 'numbers.json'
with open(filename, 'w') as f:
	json.dump(numbers, f)

使用json.load() 将列表读取到内存中:

import json

filename = 'numbers.json'
with open(filename) as f:
	numbers = json.load(f)
print(numbers)

10.3.2 保存和读取用户生成的数据

下面写一个程序:

  • 提示用户首次运行程序时输入自己的名字,并在再次运行程序时记住他。
    remember_me.py
import json
# 如果以前存储了用户名,就加载它。
# 否则,提示用户输入用户名并存储它。
filename = 'username.json'
try:
    with open(filename) as f:
        username = json.load(f)
except FileNotFoundError:
    username = input("What is your name? ")
    with open(filename, 'w') as f:
        json.dump(username, f)
        print(f"We'll remember you when you come back, {username}!")
else:
    print(f"Welcome back, {username}!")

这个程序运行时,将尝试从文件username.json中获取用户名。因此,首先
编写一个尝试恢复用户名的 try 代码块。如果这个文件不存在,就在except 代码块中提示用户输入用户名,并将其存储到username.json中,以便程序再次运行时能够获取。

本文大部分内容来自于《Python编程从入门到实践(第2版)》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值