《A Byte Of Python3》-Swaroop.C.H(笔记)
步骤/目录:
无本文首发于个人博客https://lisper517.top/index.php/archives/4230/,转载请注明出处。
本文的原文写作日期为2020年9月4日,主要目的是总结《A Byte Of Python3》。
下面的内容有些缩进或者图片缺失,可以参考 原word文档 。
1.python中有整数、浮点数、复数。整数受限于内存大小。双引号等同于单引号,用三引号来指示多行字符串。表示’,可以\’,或者在头尾使用双引号,或者使用三引号。行末的\表示下一行与本行之间没有换行符。类似C++中的raw string,前面加r或R可指定自然字符串。相邻的字符串会被自动连接。
输出中的format方法,类似printf+setf,可以调整格式。
标识符不能以数字开头,大小写敏感,只能用数字、字母、下划线。可以使用中文。
python中的任何东西都是对象。
变量不需要声明类型,可以直接初始化。
python默认一行一句,若一行多句可用;间隔。使用缩进来决定语句的层次,
2.定义了字符串与整数的*操作;x**y为x的y次方;定义了浮点数的%求余;//为取整除 - 返回商的整数部分(向下取整);&、|、^为按位与、或、异或;~x为-(x+1);比较操作符可连接;not为非操作,类似!;and、or为和、或操作;in和not in为从属关系,is和not is为是否关系。优先级见p25。
3.有if、while、for三种控制流语句,没有switch,某些场合下用字典代替。条件后跟:,while后可选else,for后也可选else。break用于跳出,注意,对应的else部分不会执行;continue。
4.range函数,提供第一个参数到第二个参数的序列(不含第二个参数),步长为1,可用第三个参数调整步长。len函数返回字符串的长度。
5.函数:用关键字def定义,如
def 函数名(参数表):
函数体
使用global语句来调用block外的变量。可以同时声明多个变量。
非局部:用于定义函数中的函数,介于局部和全局之间,nonlocal
函数的参数默认值也需要从右到左,但调用时可以只给出其中几个值而忽略其他值来使用默认参数,这时参数的顺序可以乱序。
参数个数不确定,可以使用*。单个*可以将参数收集为一个列表,**则可以将参数收集为字典。*后面要输入非列表中的参数,需要用keyword-only参数,如果仅想使用keyword-only参数,可以使用*后面不带名字,然后接一个k-o参数。
return用于退出函数,单独的return等同return None。pass代表空语句块。
Docstring,在模块、类或者函数中,用三引号括起来的部分,是该部分的说明。使用print(对象名.__doc__)可以打印其说明文档。其首行以大写字母开始、句号结束,第二行为空行,第三行开始说明。help就是抓取docstring,按q可退出help。
6.模块:类似C中多个源文件。要使用某个模块,可import之,如果不是内置的模块,解释器会在sys.path中列出的路径中查找(其第一个元素就是当前目录),找到后运行这个模块,这个初始化过程仅在第一次导入时运行。
在执行python XXX.py 参数表 时,会将参数表传递给XXX.py模块,用sys.argv列表可查看参数列表,其中sys.argv[0]元素是脚本名称。查看os.getcwd()可获取当前目录。
为了使导入模块变快,会自动创建按字节编译的pyc文件,在当前目录,若没有写权限则不会创建。pyc文件与平台无关。
如果想导入sys中的argv、使其可以直接使用而不加sys.,可from sys import argv,或者导入sys中全部:from sys import *(但不会导入双下划线开头的对象),一般应避免这样使用。
每个模块都有__name__,若其为’__main__’说明这个模块类似含有main函数。此可用来避免import模块时其自动运行一次。
dir()函数可以列出模块中的标识符(类,函数,变量),给其空参数则会列出本模块的标识符。del语句可以删除变量或名字。
包是一个文件夹,含有多个模块,其中有一个__init__.py文件来指明该文件夹包含python模块。包可嵌套。
7.数据结构:列表、元组、字典、集合。
列表list用[]包括,元素间用逗号分隔,有序。可以用append方法来在列表尾部添加元素。对列表使用len会计数其元素个数。列表还可以使用sort方法,或者用del删除某个元素。列表中的元素类型可以不同,比如一个字符串和整数在同一个列表中。列表可嵌套。
元组和列表类似,但像字符串一样不可变,用()包括(也可以不带括号)。含一个元素的元组需要在该元素后加逗号,来区别括号表达式。
字典:键值对,键要求唯一且不可变,比如字符串做键,值可变。字典用{}包括,每个对之间用逗号分隔,键与值间用:分隔,为 键:值 。字典无序,可以自己排序。del 字典名[键] 可以删除该键值对,使用 字典名[键]=值 来添加键值对。使用 for x,y in 字典名.items(): 可遍历字典(items返回元组的列表)。
元组、字符串和列表都是序列,有切片操作。[x:y:z],从x开始到y之前(不包括y)的元素,步长为z(省略时为1),x省略默认为从开头开始,y省略默认到结尾(包括结尾)。[::-1]表示倒序。
集合:无序。用set([])来表示,用in来查看有无元素,copy方法来复制集合,add方法增加元素,issuperset方法来判断子集,remove方法删除元素,&或intersection方法求交集。
8.变量赋值导致引用、alias,slicing可以创建拷贝。
字符串都是str类,方法众多。startswith(pattern),检验是否以pattern开头;find(p),返回位置,找不到返回-1;p.join(str类序列),在str类序列中加入p作为分隔符,并返回这个大字符串。
9.路径中有空格时需要再加双引号。cmd只能识别双引号。
time库中有一些时间的输出格式。
os提供与系统的交互。os.system()向shell输出字符串命令,os.path.exists()判断路径是否存在,os.mkdir()创建路径。
10.类使用class定义,类的方法也有隐藏的this指针,即self参数。self参数在写方法时必须要加上。类的方法也可以在不实例化时使用。
构造函数,可以自己定义,方法名为__init__。
在类方法前面写的变量是类变量,由所有对象共享,与c++区别。双下划线开头的数据成员则是每个对象私有。一些不涉及具体对象的方法可定义为静态方法,即在函数结束后写 函数名=staticmethod(函数名) ,对齐def。
继承:将父类的名称作为一个元组,写成class 子类(父类):
子类的构造函数不会自动调用父类的构造函数,需要显式调用。
11.一些str处理:字符串.lower()返回字符串的小写形式;字符串.replace(p1,p2)将其中的p1以p2替换;
string.punctuation为所有标点符号的序列。
12.读写文件用file类的对象。
如f = open(‘test.txt’, ‘w’),以写模式打开test.txt。还有r、a(附加)、b(二进制)等模式,不加参数时默认以r模式打开text文件。f.write(字符串)为向文件写入字符串,f.readline()为读取并返回文件中的一行字符串,可搭配循环使用,遇到EOF时返回空字符。
用pickle库读写对象:pickle.dump(待写入对象,f),f是一个file对象,待写入对象可以是任意对象。pickle.load(f)为读取文件。
13.try、except异常处理:后面不带圆括号的except可处理所有异常。一个try应该跟着一个except,如果没有则用默认的except:打印错误信息并退出。如果except块内写continue,就可以不管异常、继续运行。
可以编写自己的异常类,一个异常类应该直接或间接继承Error或Exception类,然后用raise 异常类来触发这个异常类:
class ShortInputException(Exception):
def __init__(self, length, atleast):
Exception.__init__(self)
self.length = length
self.atleast = atleast
try:
text = input('Enter something:')
if len(text) <3:
raise ShortInputException(len(text), 3)
except EOFError:#ctrl + D引发,未输入任何东西
print('please enter something')
except ShortInputException as ex:#ex为自己写的异常类的对象
print('ShortInputException: The input was {0} long, expected at least {1}'\
.format(ex.length, ex.atleast))
else:
print('No exception triggered')
finally:不管怎样都会执行的块。即使except而退出,也会先执行这里。
try:
a = int(input("请输入 a 的值:"))
print(20/a)
except:
print("发生异常!")
else:
print("执行 else 块中的代码")
finally :
print("执行 finally 块中的代码")
上例中的else必须搭配except,且在except的后面。
with也能起类似的作用。具体看https://developer.ibm.com/zh/articles/os-cn-pythonwith/
浅谈:起到类似 try:
except:
finally:的作用;代码更少,还有其他好处。
只能用于有上下文管理器,即有__enter__() 和__exit__()方法的对象。__enter__()方法会在with的代码块执行之前执行,__exit__()会在代码块执行结束后执行。__exit__()方法内会自带当前对象的清理方法。
14.标准库:
sys包含系统指定的函数功能;warnings包含一些警告模块;logging得到调试信息:
#!/usr/bin/python
# Filename: use_logging.py
import os, platform, logging
if platform.platform().startswith('Windows'):
logging_file = os.path.join(os.getenv('HOMEDRIVE'), 'test.log')
else:
logging_file = os.path.join(os.getenv('HOME'),'test.log')
logging.basicConfig(
level = logging.DEBUG,
format = '%(asctime)s : %(levelname
)s : %(message)s',
filename = logging_file,
filemode = 'w',
)
logging.debug("Start of the program")
logging.info("Doing something")
logging.warning("Dying now")
其中platform模块可以得到平台信息
15.其他:
a,b = (1,2)会使得a为1、b为2,函数可以返回元组。a ,*b = [1,2,3]使得a为1,b为[2,3]。可以用a,b=b,a交换两个变量。
类的常用方法:
Lambda表达式:一种函数
列表综合:根据已有列表生成新列表
listone = [2,3,4]
listtwo = [2*i for i in listone if i > 2] #得到[6,8]
exec(字符串)可将字符串作为python语句执行;eval(字符串)则可将字符串作为python表达式求值。
assert:声明某个条件必须满足,不满足则会引发错误并退出程序。
repr函数用来取得对象的规范字符串表示。大多数时候都有eval(repr(object)) == object。需要类有__repr__方法。
isatty()方法是否连接到终端设备。如sys.stdout.isatty()检测stdout是否连接显示器。