【Python教程】《零基础入门学习Python》最新版

修改编辑器的字体,使中英文标点符号差异大些:
- 点击IDLE菜单栏上"Options-Configure IDLE"
- 选择"Fonts/Tabs"选择等宽字体(推荐Consolas),点击"Apply"后点击“OK”
Python3代码样式指导手册(PEP8)
https://fishc.com.cn/thread-139746-1-1.html
变量名可以用汉字表示 eg:数量=1
python内置函数共68个

Tab 键除了用于缩进,Tab 键的另一个妙用就是自动填充,比如咱输入 pr 两个字符,再摁一下键盘上的 Tab 键,会弹出一个提示款,IDLE 在猜测你想干哈呢
Python3 虽然支持中文作为变量名,但有些大牛却不赞同这么做,你觉得他们的依据是什么?
答:随着时代的发展,越来越多的编程语言不仅支持纯英文代码,还支持全球多数国家的语言开发,有些变态的甚至还能使用 Emoji 符号……但是,都没能流行起来!为什么呢?以下是小甲鱼认同的几点原因,欢迎补充。
- 不利于与外国友人协同开发程序;
- 敲一个中文单词的步骤比英文单词要多;
- 习惯问题:以前的编程语言多数只支持纯英文,大家只能硬着头皮用英文;
- 就算是变量名支持中文了,但符号却还是只能使用英文的;
- 难道你们不觉得切输入法很烦吗?
给变量命名,要避免与 Python 内部使用的名字冲突,不然这个内置函数就废掉了
如果要为一个函数写说明文档,那么你觉得应该使用哪种字符串比较合适?三引号字符串,也就是长字符串合适。
如果在 IDLE 的交互模式中使用 help(obj) 函数,可以查看到 obj 对应的说明文档
print()
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)



1 + 1 >= 2返回 True。 2 >= 2 成立
random -- 生成伪随机数
https://fishc.com.cn/thread-145254-1-1.html
可以实现对伪随机数的攻击,random生成的随机数可以被重现:
random.getstate()获取随机数种子加工之后,随机数生成器的内部状态
x=random.getstate()
random.randint(1,10)
random.setstate(x)
random.randint(1,10)
Python 除法的运算结果是以浮点数的形式存储的(尽管结果可以整除)
浮点数在计算机中的存储是存在 “误差” 的,但当浮点数相加的结果等于整数时,偏差则不会出现。如果需要做到 100% 精确计算浮点数,请使用 decimal 模块(传送门)
from decimal import Decimal
a = Decimal('0.1')
b = Decimal('0.3')
print(a - b)
#-0.2
random.randint(a, b) 返回一个随机整数 N,范围是:a <= N <= b
拥有相同的种子的语句,打印的结果是相同的

random.sample(range(1,8),6)从1-7之间随机抽取6个不重复数
运算符 // 取比目标结果小的最大整数 -3//2 #-2
如果给 int() 函数传入一个浮点数参数,那么 int() 是简单暴力地将小数部分裁掉(比如 int(9.99) 的结果等于 9)……可是我们更习惯的是使用“四舍五入”的方式来取整。如果不借助其它函数,你能够单纯使用 int() 函数来实现吗
答:只需要将 int() 函数的参数 +0.5 即可实现四舍五入


and 和 or 遵从短路逻辑


print1 if condition1 else print2

extend()参数必须是可迭代对象,新加内容追加到列表最后一个元素的后面

list变量名.clear() 清空列表
列表X is 列表Y False。因为列表X和Y的值位置不同

浅拷贝:copy() 或者 lista=listb[:]
深拷贝:decopy()
两者效果一样,但后者效率更快,但后者推导式语句使用较为复杂时,需要权衡下使用,后期是否好维护

字符串

swapcase()将原字符串大写变小写,小写变大写。

fillchar默认为0

zfill(width) ,当width大于原字符串width, 用0填充左侧。

find()从左往右找,rfind()从右往左找

在find()里的值,没有在字符串里,会返回-1。
在index()里的值,没有在字符串里,会报错。

expandtabs(4)即指定一个tab等于4个空格

#P30

[,start[,end]]代表start和end是可选参数

removeprefix(prefix)和removesuffix(suffix)允许删除指定的前缀或后缀
将字符串以参数指定的分隔符为依据将字符串切割并返回1个3元组。
partition() 从左往右
rpartition()从右往左
split()从左往右
rsplit()从右往左

splitlines(keepends=False)按行分割并将结果以列表的方式返回。keepends=True表示结果包含换行符

.join()拼接效率 比 +拼接效率 高


format()





例如:

适用整数的值有(值前面加#会在输出时显示值类型):

例如

适用浮点数的值有(值前面加#会在输出时显示值类型):

例如:

is 、is not 判断是否同一对象


sort和sorted处理列表排序,使用sort(),原列表会被改变。参数reverse表示反排序,key=len表示按照len大小排序
all()判断可迭代对象所有对象是否为真
all()判断可迭代对象任一对象是否为真







1个迭代器肯定是1个可迭代对象。可迭代对象可以重复使用,而迭代器则是一次性的。
iter()

next()逐个将迭代器的元素提取出来。当迭代器没有任何元素就会报错


pop不存在元素会报错,可给一个default值替代报错信息

popitem()在python 3.7版本后删除字典最后加入的键值对。
del语句可以用于字典
clear()清空字典的键值对,字典是空的。

setdefault()查找一个键是否存在于字典中,如果不存在,则指定一个新的值
复制字典:copy()
逆向排序:reverse(3.8版本及以后才可以)
isdisjoint()
issubset()
issuperset()
union()
intersection()
difference()
symmetric_diffference()
.frozenset()创建不可变的集合
.set()创建可变的集合
不可变对象是可哈希的,可变对象是不可哈希的!

集合的嵌套使用.frozenset()


其中,/代表/左侧必须是位置参数,不能使用关键字参数
*代表*左侧可以是位置参数或关键字参数,*右侧必须是关键字参数才不会报错

return语句被执行后,直接返回结果,不会再执行之后的语句

使用**可以把参数打包成字典


全局变量可以在函数内部中访问,但无法在函数中修改值。

不建议global申明全局变量并修改,易出现难以排查的bug


在内部函数修改外部函数的变量,使用nonlocal语句

作用域的影响范围存在相互覆盖的情况,当冲突出现的时候,python会选择谁?
Local(局部作用域) 、Enclosed(嵌套函数外层函数作用域)、Global(全局作用域)、Build-In(内置作用域)
Local与Global发生冲突时,除非使用global语句申明,否则python会使用Local的变量;
当函数嵌套发生的时候,除非使用nonlocal语句,
否则局部作用域又会覆盖外层函数的作用域的变量

多看几遍...

以下写法结果相同

表示调用myfunc()时把myfunc()作为参数传递给装饰器time_master()再调用装饰器


多个装饰器 从最靠近函数的@开始

以下写法结果相同



lambda能出现在python不允许def语句出现的地方

在函数中,yield表达式代替return语句就是生成器。下例是counter()生成器

生成器的作用是每次提供1个数据。不能使用下标索引的方式获取值,会报错。

generator object 生成对象。
递归(函数调用函数本身),如果没有结束条件,就会不断运行,直至ctrl+c强制终止



def hanoi(n,x,y,z):
#print("!!--------------------",str(n),x,y,z)
if n==1:
print(x,"-->",z)
else:
hanoi(n-1,x,z,y)
#print("++---------------------",str(n-1),x,z,y)
print(x,"-->",z)
hanoi(n-1,y,x,z)
# print("----------------------",str(n-1),y,x,z) # 1 b a c
n=int(input("层数:"))
hanoi(n,"a","b","c")
使用help(函数名)查看函数文档

:str 或者:int 、 ->str是给人看的,即类型注释,是作者期望输入的类型,如果不按类型注释输入,python也不会阻止/报错。

.__name__ 获取函数名字
.__annotations__查看类型注释
.__doc__查看函数文档
当一个函数接收另一个函数作为参数时,该函数为高阶函数
functool库

将1个函数的多个参数拆分多次进行传递

没调用@wraps之前,是有副作用的(红框)

调用后

ctr+f 搜索快捷键

form pathlib import Path()
Path.cwd() #获取当前目录的路径·
.is_dir()#判断一个路径是否为一个文件夹
.is_file()#判断一个路径是否为一个文件
.exist()#判断一个路径是否存在
.name#获取路径的最后一个部分
.stem获取文件名
.suffix获取文件后缀
.parent获取父级目录
.parents获取逻辑祖先路径构成的序列

.parts将路径的各个组件拆分成元组

.stat查询文件/文件夹的信息

绝对路径:文件真正存在的路径
相对路径:以当前目录为基准进行一级一级目录推导的路径。使用 . 表示当前路径,..表示上一路径
resolve()将相对路径变为绝对路径
iterdir()获取当前路径下所有子文件和子文件夹
generator object 生成器

打印文件列表

mkdir()创建文件夹。如果要创建的文件夹已存在,会报错。除非exist_ok=True

创建多个文件需要设置红框内容才不会报错

open()打开文件
rename()修改文件名字
replace()替换指定的文件或文件夹
rmdir()删除文件夹(文件夹为空才不报错)
unlink() 删除文件
glob()查找

with语句能确保文件关闭。
生成以二进制形式保存内容的pkl文件


读取pkl 内容


try-except-else:没运行except就会接着运行else
try-except-finally 无论异常是否发生都会运行finally

实现代码自爆。

能偷天换日

raise 不能生成异常。

异常列:
通常用于代码调试
条件不成立时引发AsserttionError

利用异常实现goto

类里面的变量是属性,函数叫方法。
可通过实例对象访问类的属性和方法
在创建对象之前,通过类将相关属性和方法给打包到一起,然后通过类生成相应的对象。
class B:子类 class A:父类
当子类存在与父类相同的属性和方法,访问子类时将得到子类的属性和方法

判断1个对象是否属于1个类 isinstance()
由于B是子类,所以isinstance(b,A)也True

检测1个类是否为另一个类的子类 issubclass()

1个子类可以同时继承多个父类。


__dict__可以访问出实例对象有哪些属性
最小的类
