读《Python编程:从入门到实践》-埃里克·马瑟斯 笔记
读本书的目的是想把一些基础概念再温习一遍.
第2章 变量和简单数据类型
方法是Python可对数据执行的操作。通过.
访问, 与C++,golang访问方法一致.
Python使用加号(+)来合并字符串。
需要注意的是双引号可以输出换行制表符
字符串常用操作删除 空白字符方法
你还可以剔除字符串开头的空白,或同时剔除字符串两端的空白。为此,可分别使用方法lstrip()和strip():
字符串可以使用撇号定义:
◆ 例如,在用单引号括起的字符串中,如果包含撇号,就将导致错误。这是因为这会导致Python将第一个单引号和撇号之间的内容视为一个字符串,进而将余下的文本视为Python代码,从而引发错误。
字符串拼接:
1 | age = 23 |
数字不会自动转换成字符串,需要通过str
函数强制转换.
第3章 列表简介
通过倒数访问数组元素:
1 | bicycles = ['trek','cannondale','redline','specialized'] print(bicycles[-1]) |
索引-2返回倒数第二个列表元素,索引-3返回倒数第三个列表元素,以此类推。
修改可通过索引访问直接进行重新赋值.
添加元素:
1 | motorcycles.append('ducati') |
方法append()将元素’ducati’添加到了列表末尾,而不影响列表中的其他所有元素:
使用del语句删除列表中元素
1 | del motorcycles[1] |
使用方法pop()删除元素
实际上,你可以使用pop()来删除列表中任何位置的元素,只需在括号中指定要删除的元素的索引即可。
1 | motorcycles = ['honda','yamaha','suzuki'] |
如果你只知道要删除的元素的值,可使用方法remove()。
1 | motorcycles = ['honda','yamaha','suzuki','ducati'] |
使用insert插入:
1 | motorcycles = ['honda','yamaha','suzuki'] motorcycles.insert(0,'ducati') |
排序函数:sorted
使用函数sorted()对列表进行临时排序,不会影响到原数组.
1 | print(sorted(cars)) |
使用函数len()可快速获悉列表的长度。
第4章 操作列表
遍历操作:
1 |
|
列表的复制:
要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:])。这让Python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。
1 | my_foods = ['pizza','falafel','carrot cake'] |
Python将不能修改的值称为不可变的,而不可变的列表被称为元组。
元组的概念类似于C里的 int[3] 长度一旦定义那就是不可变的.
◆ 元组看起来犹如列表,但使用圆括号而不是方括号来标识。定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。
1 |
|
第5章 if语句
使用and 来定义&&
1 | (age_0 >= 21) and (age_1 >= 21) |
◆ 要检查是否两个条件都为True,可使用关键字and将两个条件测试合而为一;如果每个测试都通过了,整个表达式就为True;如果至少有一个测试没有通过,整个表达式就为False。
使用or 来定义 ||
◆ 关键字or也能够让你检查多个条件,但只要至少有一个条件满足,就能通过整个测试。仅当两个测试都没有通过时,使用or的表达式才为False。
列表的检查:
◆ 检查特定值是否包含在列表中有时候,执行操作前必须检查列表是否包含特定的值。
1 | >>>requested_toppings = ['mushrooms','onions','pineapple'] |
还有些时候,确定特定的值未包含在列表中很重要;在这种情况下,可使用关键字not in。
使用elif 关键字定义: else if, 否则 else.
第6章 字典
字典的定义
字典的定义类似于golang,js语言
alien_0 = {'color':'green','points':5}
字典的访问:
new_points = alien_0['points']
注意,键—值对的排列顺序与添加顺序不同。Python不关心键—值对的添加顺序,而只关心键和值之间的关联关系。
字典遍历:
1 |
|
遍历所有的建:
for name in sorted(favorite_languages.keys()):
遍历所有的值:
可使用方法values()
第7章 用户输入和while循环
while 循环:
1 | while current_number <10: |
第8章 函数
函数的定义:
1 | def greet_user(): |
c++里会标明返回值类型, golang用func
原文:❷处的文本是被称为文档字符串(docstring)的注释,描述了函数是做什么的。文档字符串用三引号括起,Python使用它们来生成有关程序中函数的文档。
参数的默认值:
◆ 关键字实参是传递给函数的名称—值对。你直接在实参中将名称和值关联起来了,因此向函数传递实参时不会混淆(不会得到名为Hamster的harry这样的结果)。关键字实参让你无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。
describe_pet(animal_type='hamster',pet_name='harry')
函数参数默认是传递的是引用:
原文:为解决这个问题,可向函数传递列表的副本而不是原件;这样函数所做的任何修改都只影响副本,而丝毫不影响原件。
为解决这个问题,可向函数传递列表的副本而不是原件;这样函数所做的任何修改都只影响副本,而丝毫不影响原件。
传递拷贝
function_name(list_name[:])
可变参数:
def make_pizza(*toppings):
make_pizza('mushrooms','green peppers','extra cheese')
◆ 形参名*toppings中的星号让Python创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中。
可变参数必须将该形参放在形参*toppings的前面,
和其它与语言一样,可变实参放到后面
可变形参按字典传入
◆ 形参**user_info中的两个星号让Python创建一个名为user_info的空字典,并将收到的所有名称—值对都封装到这个字典中。
1 | def build_profile(first,last,**user_info): |
模块组织
python模块组织的搜索路径
-
程序的主目录:如果你的主程序是在
/home/user/mycode/program.py
,那么/home/user/mycode
就是程序的主目录,Python会首先搜索这个目录。 -
PYTHONPATH环境变量:你可以在操作系统的环境变量中设置PYTHONPATH,这是一个包含了Python模块的目录列表。
-
标准库目录:Python在安装时会设置这个目录。
-
在任何
.pth
文件中的路径:.pth
文件是一个包含了目录路径(每行一个)的简单文本文件,它必须位于Python的site-packages
目录下。Python在启动时会读取这个文件,并把文件中的路径添加到模块搜索路径中。 -
当前工作目录(如果Python解释器在交互模式下运行)。
所以,如果你的模块文件在一个深层次的目录下,你需要确保这个目录包含在上述的搜索路径中,否则Python解释器将无法找到它。你可以通过修改PYTHONPATH环境变量或者添加.pth
文件来实现这一点。
自定义项目的包:
在Python中,包是一个包含__init__.py
文件的目录,用于组织模块。包的路径就是从顶级目录(通常是你的项目目录或Python的安装目录)到包的目录的路径。
例如,如果你有一个名为myproject
的项目,其中有一个名为mypackage
的包,那么mypackage
的路径就是myproject/mypackage
。
当你导入一个包或包中的模块时,你需要使用包的完全限定名,也就是从顶级包开始的包的路径,用点分隔。例如,如果你想导入上面例子中的mypackage
,你可以这样做:
1 | import myproject.mypackage |
init文件信息
__init__.py
文件可以是空的,也可以包含Python代码。当你导入一个包时,__init__.py
文件会被自动执行。你可以在__init__.py
文件中执行一些初始化的代码,或者设置包的__all__
变量。
__all__
是一个字符串列表,用于定义当从包中导入*时,应该导入哪些模块。例如,如果你的包中有module1
、module2
和module3
,但你只想在使用from mypackage import *
时导入module1
和module2
,你可以在__init__.py
中这样设置:
1 | __all__ = ['module1', 'module2'] |
模块定义:
模块是扩展名为.py的文件,包含要导入到程序中的代码。
如果你使用这种import语句导入了名为module_name.py的整个模块,就可使用下面的语法来使用其中任何一个函数:
module_name.function_name
frommodule_name import function_name
通过用逗号分隔函数名,可根据需要从模块中导入任意数量的函数:
frommodule_name import function_0,function_1,function_2
若使用这种语法,调用函数时就无需使用句点。由于我们在import语句中显式地导入了函数make_pizza(),因此调用它时只需指定其名称。
如果要导入的函数的名称可能与程序中现有的名称冲突,或者函数的名称太长,可指定简短而独一无二的别名——函数的另一个名称,类似于外号
第9章 类
类 中init 方法:
处的方法__init__()是一个特殊的方法,每当你根据Dog类创建新实例时,Python都会自动运行它
和C++里的 构造函数一致
通过self访问当前实例
要访问实例的属性,可使用句点表示法。
self.age = age
:原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
◆ 2024/10/27发表想法
实现继承的方式
class ElectricCar(Car)
调用父类的初始化方法
super().__init__(make,model,year)
子类可以对父类进行重写:
可以在子类定义相同参数,名称的函数.
类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。
第10章 文件和异常
1 |
|
关键字with在不再需要访问文件后将其关闭。在这个程序中,注意到我们调用了open(),但没有调用close();你也可以调用open()和close()来打开和关闭文件,但这样做时,如果程序存在bug,导致close()语句未执行,文件将不会关闭。
1 | filename = 'pi_digits.txt' |
1 | filename = 'programming.txt' |
◆ 打开文件时,可指定读取模式(‘r’)、写入模式(‘w’)、附加模式(‘a’)或让你能够读取和写入文件的模式(‘r+’)
try 捕获异常
1 | try: |
Python有一个pass语句,可在代码块中使用它来让Python什么都不要做:
1 | try: |
第11章 测试代码
Python标准库中的模块unittest提供了代码测试工具。单元测试用于核实函数的某个方面没有问题;测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求
1 | class NamesTestCase(unittest.TestCase): |
测试流程基本和golang语言一致
第16章 下载数据
date包
first_date = datetime.strptime('2014-7-1','%Y-%m-%d')
在实际工作中,原始数据的格式经常是不统一的,此类数值类型转换造成的ValueError异常十分普遍。这里的原因在于,Python不能直接将包含小数点的字符串’6928.6492’转换为整数。为了消除这种错误,需要先将字符串转换为浮点数(float),再将浮点数转换为整数(int):
这点不如php灵活
第17章 使用API
1 | import requests |
第19章 用户账户
运行函数前会根据装饰器定义的函数,先执行修改的函数
原文:装饰器(decorator)是放在函数定义前面的指令,Python在函数运行前,根据它来修改函数代码的行为
1 | from django.core.urlresolvers import reverse |
python 其它语法结构
字典推导式语法
{key: value.to(device) for key, value in inputs.items()} python
这是 Python 中的字典推导式(dictionary comprehension)语法。它是一种创建字典的简洁方式。
让我们逐步解析这个表达式:
-
inputs.items()
:items()
是 Python 字典的一个方法,它返回一个包含字典所有键值对的视图对象,每个元素是一个元组,元组的第一个元素是键,第二个元素是值。 -
for key, value in inputs.items()
:这是一个 for 循环,它遍历inputs.items()
返回的所有键值对。在每次迭代中,key
和value
分别被赋值为当前键值对的键和值。 -
key: value.to(device)
:这是新字典的一个键值对。键是key
,值是value.to(device)
。value.to(device)
可能是在将某种数据(可能是 PyTorch 的张量)移动到某个设备(如 GPU)上。 -
{... for ... in ...}
:这是字典推导式的语法。它创建一个新的字典,字典的每个键值对由 for 循环的每次迭代生成。
所以,整个表达式的意思是:创建一个新的字典,新字典的键与 inputs
字典的键相同,值是 inputs
字典的值经过 to(device)
处理后的结果。
总结
python 这门语言的默认类型校验还是比较严格的,所以使用的时候注意一下变量类型.其他的基础语法和别的语言没有太多的区别。关键是一些三方,系统库的使用