Python入门、语法、进阶
     分类:Python     有: 0 条评论

Python入门、语法、进阶

     分类:Python     有: 0 条评论

python基础

安装Python

官网:www.python.org
建议官网下载安装程序安装,也可用第三方工具包如:Anaconda

Python解释器

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143161198846783e33de56d4041058c3dfc7e44ee1203000

Python教程

https://www.runoob.com/python3/python3-tutorial.html
https://www.liaoxuefeng.com/wiki/1016959663602400


要注意的

语法

请务必注意,Python程序是大小写敏感的,如果写错了大小写,程序会报错。
Python使用缩进来组织代码块,请务必遵守约定俗成的习惯,坚持使用4个空格的缩进。
在文本编辑器中,需要设置把Tab自动转换为4个空格,确保不混用Tab和空格。最少也要加tab键或空格,不然报错


变量

把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据,例如下面的代码:
a = 'ABC'
b = a
a = 'XYZ'
print(b)
最后一行打印出变量b的内容到底是'ABC'呢还是'XYZ'?如果从数学意义上理解,就会错误地得出b和a相同,也应该是'XYZ',但实际上b的值是'ABC',让我们一行一行地执行代码,就可以看到到底发生了什么事:
执行a = 'ABC',解释器创建了字符串'ABC'和变量a,并把a指向'ABC':
mark
执行b = a,解释器创建了变量b,并把b指向a指向的字符串'ABC':(b是找到a所指向的地址,再把自己的指向那个地址,然后b就和a没关系了。)
mark
执行a = 'XYZ',解释器创建了字符串'XYZ',并把a的指向改为'XYZ',但b并没有更改:
mark
所以,最后打印变量b的结果自然是'ABC'了。


整除

解释一下整数的除法为什么也是精确的。在Python中,有两种除法,一种除法是/:

>>> 10 / 3
3.3333333333333335

/除法计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数:

>>> 9 / 3
3.0

还有一种除法是//,称为地板除,两个整数的除法仍然是整数:

>>> 10 // 3
3

你没有看错,整数的地板除//永远是整数,即使除不尽。要做精确的除法,使用/就可以。
因为//除法只取结果的整数部分,所以Python还提供一个余数运算,可以得到两个整数相除的余数:

>>> 10 % 3
1

无论整数做//除法还是取余数,结果永远是整数,所以,整数运算结果永远是精确的。


字符串和编码

最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言,例如:

>>> print('包含中文的str')
包含中文的str

对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:

>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'

如果知道字符的整数编码,还可以用十六进制这么写str:

>>> '\u4e2d\u6587'
'中文'

两种写法完全是等价的。
由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
Python对bytes类型的数据用带b前缀的单引号或双引号表示:x = b'ABC'

要注意区分'ABC'和b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。
以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。
在bytes中,无法显示为ASCII字符的字节,用x##显示。
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:

>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'

抽象

抽象是数学中非常常见的概念。举个例子:
计算数列的和,比如:1 + 2 + 3 + ... + 100,写起来十分不方便,于是数学家发明了求和符号∑,可以把1 + 2 + 3 + ... + 100记作:

$$\sum\limits_{n = 1}^{100} n $$

这种抽象记法非常强大,因为我们看到 ∑ 就可以理解成求和,而不是还原成低级的加法运算。
而且,这种抽象记法是可扩展的,比如:

$$\sum\limits_{n = 1}^{100} n^2+1 $$

还原成加法运算就变成了:
(1 x 1 + 1) + (2 x 2 + 1) + (3 x 3 + 1) + ... + (100 x 100 + 1)
可见,借助抽象,我们才能不关心底层的具体计算过程,而直接在更高的层次上思考问题。
写计算机程序也是一样,函数就是最基本的一种代码抽象的方式。


返回多个值

import math语句表示导入math包,并允许后续代码引用math包里的sin、cos等函数。
然后,我们就可以同时获得返回值:

>>> x, y = move(100, 100, 60, math.pi / 6)
>>> print(x, y)
151.96152422706632 70.0

但其实这只是一种假象,Python函数返回的仍然是单一值:
>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)

原来返回值是一个tuple!但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。


函数的参数

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431752945034eb82ac80a3e64b9bb4929b16eeed1eb9000


递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出:
fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n
所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。
于是,fact(n)用递归的方式写出来就是:

def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)

如果我们计算fact(5),可以根据函数定义看到计算过程如下:
===> fact(5)
===> 5 * fact(4)
===> 5 (4 fact(3))
===> 5 (4 (3 * fact(2)))
===> 5 (4 (3 (2 fact(1))))
===> 5 (4 (3 (2 1)))
===> 5 (4 (3 * 2))
===> 5 (4 6)
===> 5 * 24
===> 120

上面的fact(n)函数由于return n * fact(n - 1)引入了乘法表达式,所以就不是尾递归了。要改成尾递归方式,需要多一点代码,主要是要把每一步的乘积传入到递归函数中:

def fact(n):
    return fact_iter(n, 1)

def fact_iter(num, product):
    if num == 1:
        return product
    return fact_iter(num - 1, num * product)

可以看到 return fact_iter(num - 1, num * product)仅返回递归函数本身,num - 1num * product 在函数调用前就会被计算,不影响函数调用。
fact(5)对应的fact_iter(5, 1)的调用如下:
===> fact_iter(5, 1)
===> fact_iter(4, 5)
===> fact_iter(3, 20)
===> fact_iter(2, 60)
===> fact_iter(1, 120)
===> 120


练习
汉诺塔的移动可以用递归函数非常简单地实现。
请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法,例如:

要理解递归首先你得理解递归。
递归题就是找感觉,要有要把大象装冰箱总共分几步?这样的思维方式,
一但去抠细节你就中计了。
汉诺塔问题有三根柱子,我给它们分别命名为起始柱src,临时柱tmp,目的柱dst
盘子一共分两种情况:
1.只有1个盘子
这种情况下,直接从起始柱src 移动到 目的柱dst ,完成任务。
2.有1个以上的盘子
假如有n个盘子在起始柱,

  1. 首先把第n个盘子上方的n-1个盘子搬到临时柱。
  2. 然后把第n个盘子从起始柱移动到目的柱
  3. 最后把n-1个盘子从临时柱搬到目的柱 任务完成
    知道这些就够了,千万别XJB去想细节!!!

知道这些就够了,千万别XJB去想细节!!!
知道这些就够了,千万别XJB去想细节!!!

def move(from,to): #将盘子从from移动到to,动画效果需要脑补
    print(from,'->',to)

def hanoi(n,src,tmp,dst):#将n个盘子从src搬到dst
    if n == 1: #只有一个盘子的情况
        move(src,dst)
    else: #有一个以上盘子的情况
        hanoi(n-1,src,dst,tmp) #将上方的n-1个盘子从src搬到tmp
        move(src,dst) #将第n个盘子从src轻松愉快地移动到dst
        hanoi(n-1,tmp,src,dst) #擦屁股,将tmp上的n-1个盘子搬到dst上

hanoi(3,'A','B','C')


进阶知识

杂项

python入门:https://mp.weixin.qq.com/s/DZ589xEbOQ2QLtiq8mP1qQ
Python各种下划线的含义,熟悉又陌生的东西!:https://mp.weixin.qq.com/s/UeGvCzrLnswttit0yQXigw
手把手教你发布 Python 项目开源包:https://mp.weixin.qq.com/s/erdYFFNt1ZMvPoGpHfuHPg


语法、代码优化

18式优雅你的Python:https://mp.weixin.qq.com/s/gaJdPVJYuEXUnx0XazCbxw
Python 3之潜藏的利器:https://mp.weixin.qq.com/s/yLZzG1uN5tctJI_ESVCsDg
经常用得到的24个加速 Python 窍门:https://mp.weixin.qq.com/s/NNMOmFMrCFuL5CfBeA1GUA
24 式加速你的 Python:https://mp.weixin.qq.com/s/ml7W3GVeG84gQ8i2TguOuQ
符合语言习惯的 Python 优雅编程技巧:https://mp.weixin.qq.com/s/HqRrY8WdhizkC29zYi904Q
Python 高效编程技巧:https://mp.weixin.qq.com/s/z9j1HifGJV9KSOI7hQCOoQ
Python中的lambda表达式:https://mp.weixin.qq.com/s/CsBpTh0cDyyOT0BZ5cUHwg
python优化和技巧:https://mp.weixin.qq.com/s/m0-sk_0f8xxfD-Vi4vbDUg
你写的 Python 代码可以更“瘦”:https://mp.weixin.qq.com/s/ZQuVbTSvLnDj-spadzWp7Q


代码测试
Python功能测试全代码演示实例:https://mp.weixin.qq.com/s/-LLHzZ-tV85CuI1dfsINuw


Python小知识 | 这些技能你不会?(公众号:简说Python)
https://mp.weixin.qq.com/s/eIReZmOFt1EuIFkJzETfYQ
https://mp.weixin.qq.com/s/LrX3bxqTFrOmbhpC_XzwzA
https://mp.weixin.qq.com/s/nVwuiyw03_OwPbFwiTetog
https://mp.weixin.qq.com/s/wLUKj1fKC9cVwUh7NNnPxg


一些有趣且鲜为人知的Python特性
中文版:https://github.com/leisurelicht/wtfpython-cn
英文原版:https://github.com/satwikkansal/wtfpython


装饰器

使用装饰器的技巧:https://mp.weixin.qq.com/s/Wpx8S3vleChecBuskNW8Qw
https://www.bbsmax.com/A/xl56XK17zr/
https://www.bbsmax.com/A/o75Nj1MW5W/
https://www.bbsmax.com/A/gAJG9A4bdZ/
Python中的类的定义和装饰器@classmethod与@staticmethod:https://mp.weixin.qq.com/s/t1T_K5wbovOAIdzgKjIwhg
Python 装饰器(decorator):https://baijiahao.baidu.com/s?id=1599946084778367809&wfr=spider&for=pc&isFailFlag=1
正确理解Python中的 @staticmethod@classmethod方法:https://zhuanlan.zhihu.com/p/28010894
没看完这11 条,别说你精通 Python 装饰器:https://mp.weixin.qq.com/s/8z92pbhJV1ybfE6YZfvOuw


切片

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431756919644a792ee4ead724ef7afab3f7f771b04f5000
Python切片高级特性完全解读::https://mp.weixin.qq.com/s/8kt7Z3V9Sndxuk_L8Mnd9Q


迭代器、生成器

http://www.langzi.fun/迭代器与生成器.html
成为Python大牛必须要掌握的高端语法yield:https://mp.weixin.qq.com/s/LilfnAbmU3xBRtevCWwJmw
Python yield用法浅析(stackoverflow):https://segmentfault.com/a/1190000017405045


枚举

https://segmentfault.com/a/1190000017327003


浅拷贝、深拷贝

5张图彻底理解Python中的浅拷贝与深拷贝:https://mp.weixin.qq.com/s/4_KI2ePptryq3D82RIVazw
Python中的深拷贝和浅拷贝:https://mp.weixin.qq.com/s/zZpWb1k74H9a7HZwH_PSug


线程、进程

Python线程5分钟完全解读:https://mp.weixin.qq.com/s/jh6PRg7S9_fo7jrI85ynRQ


魔法函数

python魔法函数__dict__和__getattr__的妙用:https://mp.weixin.qq.com/s/ak8UjrCSggB3_IBzQyTc2Q


用 Python 实现读写锁:https://mp.weixin.qq.com/s/qFUhK6v46tG4jqSI2ffXkg


文件处理

如何用 Python实时监控文件?https://mp.weixin.qq.com/s/fsoY482nBDEcVt8HPjqJuQ
Python 加密文件:https://mp.weixin.qq.com/s/Dy69ReNKGItwY9leg_ff0w
高效操作文件的三个建议(pathlib、流式读取大文件、设计接受文件对象的函数):https://mp.weixin.qq.com/s/iXOqe5I00sVE05qVjY0ZIw


列表

一日一技:在 Python 里面如何合并多个有序列表并使得结果依然有序?:https://mp.weixin.qq.com/s/kvVdp_QO6iiz5Vfkjq-x3g



Leetcode打卡

https://mp.weixin.qq.com/s/K4RYMcaCl2J0Oh1Nm09ewQ

LeetCode005:最长公共前缀

https://mp.weixin.qq.com/s/YPfCRxAfd2IkaiQi-pMUHA
https://mp.weixin.qq.com/s/vG5O5kQQ0U33ZW0etCZaYg

LeetCode008:有效的括号

https://mp.weixin.qq.com/s/S8qdIbddZTq_9UCR-XCY7w

LeetCode012:反转字符串

https://mp.weixin.qq.com/s/_5uqdlFAOHFF1CEiFT6HJw

LeetCode015 :存在重复元素

https://mp.weixin.qq.com/s/JGRAN2IMvXowUNmmugwTJQ



高级

异步编程

百万「并发」基础之 Python 异步编程(中篇)https://mp.weixin.qq.com/s/mAsYGnJTcgVuH0RsNpLduQ

(●゚ω゚●)