杂
Python中用#进行注释。 三单引号既是多行字符串,又可以作为注释。
以0b或0B开头表示二进制,0o或0O表示八进制,0x或0X表示十六进制。
浮点数的取值范围约为(-10^{308})至(10^{308}),精度数量级为(10^{-16})。浮点数间的运算存在不确定尾数。
复数的定义:直接把j接在虚部的数字的后面,如:
z = 1e0 + 2e0j
用z.real和z.imag调用实部和虚部。
round(f, i)表示对浮点数(f)四舍五入截取小数点后(i)位。(i可以省略,默认为0)
如果(a^b)的结果很大以至于程序不能运算,但是我们只需要对一个数取余的结果的话,可以用pow(a, b, c)计算(a^b mod c)。
max(x1, x2, ..., xn)求最大值,min同理。
int()和float()可以强制转换字符串。
complex()可以强制转换为复数。
print会自动打印一个
,如果无需换行,可以用end来指定结尾:
**表示乘方,//表示整除。
Python中没有自加自减操作。
常用逻辑语句:and、or、not、Ture、Flase
if用法:
if Co1:
Ex1
Ex2
elif Co2:
Ex3
else:
Ex4
while用法:
while Co:
Ex1
else:
Ex2
(如果循环没有因break退出,则执行else后的语句)
for用法:
for i in range(1, 5):
Ex1
else:
Ex2(若从循环内部break则不会执行)
此处range(1, 5)生成的是一个1到 4 的数字列表,而上面for中的range可以用其他列表代替。
另外,遍历字符串s中的每个字符可以用for c in s。
定义二/多维数组:
dp = [[0 for i in range(n)] for j in range(m)]
os.sep:该系统下分隔符是\还是/还是':'。
异常处理:
try:
<Block 1>
except:
<Block 2>
else:
<Block 3>
finally:
<Block 4>
如果<Block 1>发生错误,则会执行<Block 2>,否则执行<Block 3>;无论如何都会执行<Block 4>。
函数
函数定义方式:
def F(a, b, c):
Ex..;
F(a, b, c)
在函数中调用全局变量需用global声明,如:
x = 50
def F():
global x
print(x)
F()
在函数中,如果没有对某个组合数据类型的变量进行了初始化(比如C=[]),那么认为它是全局变量。
函数的参数可以像C++一样地赋予一个默认值,如:
def func(a, b=5, c=10):
print('a is', a, 'and b is', b, 'and c is', c)
func(3, 7)
func(25, c=24)
func(c=50, a=100)
输出结果为:
a is 3 and b is 7 and c is 10
a is 25 and b is 5 and c is 24
a is 100 and b is 5 and c is 50
注意:可选参数必须放在非可选参数后面。
函数参数前加一个星号表示元组,加两个星号表示字典。
如:
def fact(n, *b):
s = 1
for i in range(1, n + 1):
s *= i
for item in b:
s *= item
return s
print(fact(10, 3, 5, 8))
同一个函数内的return值的类型可以不一样。
函数的return值可以有多个、用逗号隔开,此时返回类型为元组。
lambda函数
格式:
<函数名> = lambda <参数> : <表达式>
例如:
f = lambda x, y : x + y
print(f(10, 15))
输出为25。
列表(List)
用法:
a.clear() #删除所有元素
a = [1, 2, 3] #初始化
a.append(4) #在后方插入
n = len(a) #求长度
a.sort() #排序
b = a.copy() #复制
a.insert(1,2) #在位置1插入2
a.pop(1) #将位置1处元素取出并删除
a.remove(1) #将第一个为1的元素删除
a.reverse() #反转
mx = max(a) #最值
cnt = a.count(2) #统计出现次数
for i in a:
print(i)
print(a[0]) #调用
del a[0] #删除
此外,List还支持in,not in判断,用加号连接,用乘号复制。
s.index(x)或s.index(x,i,j)返回s中i到j中第一次出现x的位置。
map(<函数名>,一个或多个序列)表示对序列中的每一个元素执行函数,python2返回新列表,python3返回新列表的迭代器。
python3例子:
map(lambda x: x ** 2, [1, 2, 3, 4, 5])
map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
#结果为[3, 7, 11, 15, 19]
元组(Tuple)
定义时用()括起来,中间用逗号隔开。(()可省略但不推荐)
元组和字符串一样不能被修改。
例:
a = (1, 2, 3);
b = (a, 4, 5, 6);
c = (a, b, 7, 8, 9)
print(a[0], a[1], a[2])
print(b[0], b[0][0], b[1], b[2], b[3])
print(c[0], c[0][0], c[1], c[2], c[3], c[4])
输出结果为:
1 2 3
(1, 2, 3) 1 4 5 6
(1, 2, 3) 1 ((1, 2, 3), 4, 5, 6) 7 8 9
(列表也可以类似地嵌套使用)
元组也可以通过len来获取长度,[]来获取下标。
字典(Dictionary)
相当于std::map,但是不会进行排序。用d = {key : value1 , key2 : value2}的形式定义。
例:
no.clear();
no = {
"Alice" : 1,
"Bob" : 2
}
print(no["Bob"])
del no["Bob"]
print(len(no))
for name, num in no.items():
print(name, num)
no["Cindy"] = 3
if "Cindy" in no:
print(no["Cindy"])
no.keys() #所有键信息
no.values() #所有值信息(它们不是list类型,但是可以用for遍历)
no.items() #所有键值对信息
d.get(k,<default>):如果键k存在,则返回对应值,否则返回<default>。
d.pop(k,<default>):如果键k存在,则取出对应值,否则返回<default>。
d.popitem():随机取出一个键值对,以元组形式返回。
(对于p = {},我们调用其类型type(p),返回的是dist而不是set)
对于以上的数据类型(包括字符串),都可以用[]进行下标调用。
下标0表示第1个元素,下标1表示第二个元素,以此类推。
负下标表示倒数第几个元素。
[a:b]表示元素a到元素b的前一个元素间的所有元素(切片(Slicing)操作)。
字符串进行切片操作得到的还是字符串。
若a省略,则表示从第一个元素开始,若b省略,则表示一直到最后一个元素。
例:
shoplist = ['apple', 'mango', 'carrot', 'banana']
print('Item 1 to 3 is', shoplist[1:3])
print('Item 2 to end is', shoplist[2:])
print('Item 1 to -1 is', shoplist[1:-1])
print('Item start to end is', shoplist[:])
另外可以在后面再加一个:和数字表示间隔,比如:
List = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
print(List[3 : 20 : 2])
输出:
[4, 6, 8, 10, 12, 14, 16, 18, 20]
如果间隔是负数,则表示倒过来排,比如"abcd"[::-1]相当于"dcba"
集合(Set)
和STL不同,Python的Set是无序的。
集合用{}表示,用{}或set()建立,用set()建立空集合。
(定义时集合中元素可以重复,会自动去重)
若定义为B = set("pypy123"),那么相当于B = {'1', 'p', '2', '3', 'y'}
运算符|取并,&取交,^取两集合中的非相同元素,S-T表示在S中但不在T中的元素。
用>,<,>=,<=判断子集和包含关系。
S.add(x):增加元素
S.discard(x):如果x在S中则删除
S.remove(x):如果x在S中则删除,如果不在则报错
S.clear(x):移除所有元素
S.pop():随机取出一个元素,若为空则报错
S.copy():返回一个副本
len(S):元素个数
x in S:是否包含
x not in S:是否不包含
set(p):将其它类型变量转成set
set可作为for循环的列表。
例:
try:
while True:
print(A.pop(), end = "")
except:
pass
注意:直接用=将一个对象赋给另一个对象时,只是引用,如果对一个进行修改,那么另一个也会随之修改。如果要使该对象可以独立修改,则需要用切片操作进行赋值。
文件操作
打开文件:<变量名>=open(<文件名>,<打开模式>)
其中,文件名为路径(既可以是绝对路径也可以是相对路径)和名称,Windows下路径用隔开,但是需要转义即写成\,为了方便一般写成/。
打开模式:
'r':只读,若不存在则返回FileNotFoundError(默认)
'w':文件不存在则创建,存在则覆盖
'x':文件不存在则创建,存在则返回FileNotFoundError
'a':文件不存在则创建,存在则在最后追加内容
'b':二进制文件模式
't':文本文件模式(默认)
'u+'(u替换为r,w,x,a中的一个):在原功能基础上增加读写功能例:
a = open('a.in','rt')(即默认)
文件关闭:<变量名>.close()
读取方式:
<f>.read(size=-1):读入全部内容,如果给出参数size,则读入前size长度。
<f>.readline(size=-1):读入一行内容,如果给出参数size,则读入该行前size长度。
<f>.readlines(hint=-1):读入所有行,以每行内容(包括换行符)为元素形成列表,如果给出参数hint,则读入前hint行。
遍历行:
fo = open("a.txt", "r");
for line in fo:
print(line);
写入方式:
<f>.write(s):写入一个字符串或字节流
<f>.writelines(s):将s中的元素无分隔符拼接后输出
<f>.seek(offset):改变指针位置,offset含义:0——文件开头;1——当前位置;2——文件结尾。
字符串
Python中字符串是不可修改的。
如果字符串中只有单引号,那么外面用双引号;如果只有双引号,那么外面用单引号;如果都有,那么就用三个单引号来表示。
用str()将数字、列表等类型转化为字符串,用len()求字符串长度。
hex(x)将数字转化为十六进制的字符串('0x'开头),oct转化为八进制。
chr(u)将Unicode码转化为对应字符;ord(x)将字符转化为Unicode编码。
用eval()将表达式的字符串转化为计算结果。
s.input('Enter Something: ')输入的是整行。
字符串用加号连接;字符串乘以一个数即将其重复并接在一起。
可以用
来指定多行字符,如:
'This is the first line
This is the second line'
另外,在一个字符串中,一个放置在末尾的反斜杠表示字符串将在下一行继续,但不会添加新的一行。
表示回退,
表示换行(光标移动到下一行行首),
表示回车(光标移动到本行行首)。
字符串常用函数:
str.lower()将字母全部变成小写;str.upper()将字母全部变成大写。
str.split(str1):将str1看作分隔符,将str分成几个字符串,返回列表。
str.count(str1):返回str1在str中的出现次数。
str.replace(old, new):返回将str中的old替换成new的结果。
str.center(width[,fillchar]):将str用fillchar扩充至width并使str居中。
str.strip(chars):在str的首尾去掉chars中列出的字符。
str.startswith(str1):返回str是否以str1开头。
str1 in str:返回str是否包含str1。
str.find(str1):返回str1在str中的位置,如果没有返回-1。
str1.join(str):将分隔符str1插入str的每一个空隙。
我们可以在引号之前加一个r或者R来指定一个原始字符串(引号里的就是字符串的内容,无需转义),如:
r"Newlines are indicated by
"
format格式化:
可以用编号或者命名来指定格式化的位置,例:age = 20 name = 'Swaroop' print('{0} was {1} years old when he wrote this book'.format(name, age))或者:
print('{name} wrote {book}'.format(name='Swaroop', book='A Byte of Python'))关于对格式化的内容进行填充,保留小数等操作:
输出1/3保留四位小数,用_填充至11位使小数居中,且用,作为千位分隔符:print("{0:_^14,.4f}".format(100000. / 3))输出:
_33,333.3333__(
^表示居中,<表示居左,>表示居右)
(加上逗号表示千位分割,没有需要可直接去掉)
(可以看作跟C的区别就是前面可以选择用什么来填充和填充的格式)
(.之后的数字既可以表示保留小数也可以表示字符串最大输出长度)
关于类型:
(f表示浮点数,d表示整数,c表示字符)
b表示二进制,o表示八进制,x表示小写的十六进制,X表示大写的十六进制;
e表示使用e的科学计数法,E表示使用E的科学计数法,%表示以百分数的形式表示浮点数。
random库
import random
seed(a = None):使用a作为随机数种子,默认为当前系统时间
random():得到一个([0.0,1.0))之间的随机小数
randint(a, b):生成([a,b])之间的随机整数
randrange(a, b, c):范围为([a, b)),步长为(c)
getrandbits(k):随机一个k比特长的随机整数
uniform(a, b):生成([a, b])之间的随机小数
choice(seq):在列表中随机选取
shuffle(seq):将列表随机打乱
time库
首先
import time
函数:
time():获取当前时间戳(从1970年1月1日0:00开始过了多少秒)(浮点数)
ctime():返回当前时间的易读方式的字符串,如'Fri Jan 26 12:11:16 2018'
gmtime():返回一个特殊的时间格式:time.gmtime() = time.struct_time(tm_year = 2018, tm_mon = 1, tm_mday = 26, tm_hour = 4, tm_min = 11, tm_sec = 16, tm_wday = 4, tm_yday = 26, tm_isdst = 0)
strftime(tpl, ts):用于格式化输出结果,其中tpl为模板,ts为struct_time类型,用法示例:
t = time.gmtime()
time.strftime("%Y-%m-%d %H:%M:%S", t)
得到字符串:'2018-01-26 12:55:20'
time.strptime(str, tpl)是time.strftime(tpl, ts)的反操作,即反格式化形成内部时间,示例:
str = '2018-01-26 12:55:20'
time.strptime(str, "%Y-%m-%d %H:%M:%S")
perf_counter()返回的是一个非常精准的时间计数值,但是计时起点不确定,只有差值才有意义。
sleep(x):休眠x秒。
附格式化对应表:
| 格式化字符串 | 说明 | 示例 |
|---|---|---|
| %Y | 年份 | 1999 |
| %m | 月份 | 01 |
| %B | 月份名称 | April |
| %b | 月份缩写 | Apr |
| %d | 日期 | 01 |
| %A | 星期 | Monday |
| %a | 星期缩写 | Mon |
| %H | 24小时制小时 | 17 |
| %I | 12小时制小时 | 5 |
| %p | 上/下午 | AM |
| %M | 分钟 | 00 |
| %S | 秒 | 00 |
turtle库
我们可以用turtle库进行简单绘图。
import turtle
初始化窗口(不是必须的):
turtle.setup(width, height, startx, starty)
(分别表示窗口的宽度,高度,以及左上角的坐标(前一个是横坐标,后一个是纵坐标))
绝对坐标指以中心为原点的平面直角坐标。
我们可以通过turtle.goto(x, y)来使画笔从原来的位置走到指定坐标并留下轨迹。
相对位置指以画笔当前正对方向为前方的相对位置。
我们用turtle.circle(r, angle)绘制一个圆心在当前方向的左边的、半径为r的、角度为angle的圆弧(angle可省略,默认为一周)(如果需要向右侧画圆,将半径改为负数即可);用turtle.bk(d)表示后退d;用turtle.fd(d)表示前进d。
goto、fd、bk都不会改变画笔的正对方向,circle可以。
另外,我们可以用turtle.seth(angle)或turtle.setheading(angle)直接指定当前正对方向的绝对角度;也可以用turtle.left(angle)和turtle.right(angle)来改变一个相对角度。
turtle.speed(v)用于调节画笔的移动速度,范围为0到10的整数。
turtle.penup()表示抬起画笔,之后的轨迹不在显现。
turtle.pendown()则表示画笔落下,之后的轨迹将会显现。
turtle.pensize(w)或turtle.width(w)可调整画笔宽度。
turtle.pencolor(color)可修改画笔颜色,其中·color有三种形式:
- 颜色字符串,比如turtle.pencolor("purple")
- RGB值(小数),如turtle.pencolor(0.1, 0.2, 0.3)
- RGB值(元组),如turtle.pencolor((0.1, 0.2, 0.3))
turtle默认用RGB的小数形式来表示颜色,但是可以调整表示方式:
turtle.colormode(1.0)
turtle.colormode(255)
turtle.dot(d)用于绘制直径为d的实心圆。
turtle.home()用于返回原点且将方向设为向右。
如果不希望绘图之后自动退出,则写一句turtle.done()即可。
turtle.write('汉字', font = ("Arial", 18, normal))可绘制汉字。
PyInstaller
PyInstaller用于将.py文件转化为可执行文件。
安装:在cmd命令行中输入pip install pyinstaller
使用:在cmd命令行中输入pyinstaller -F <文件名.py>,会生成__pycache,build,dist三个文件夹,生成文件为dist中的可执行文件,前两个文件夹可以将其删除。
其它参数:
-h:帮助
--clean:清理临时文件
-i <图标文件名.ico>:指定使用图标文件
其它第三方库
第三方库的安装方法
安装:pip install <库名>
下载但不安装:pip download <库名>
卸载:pip uninstall <库名>
更新:pip install -U <库名>
查看详细信息:pip show <库名>
搜索:pip search <关键词>
已安装列表:pip list
文件安装:如在https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud上下载编译后的文件,然后pip install <文件名>即可。
jieba库
jieba库是中文分词第三方库(利用词库将文本进行分词以得到一个个词语)。
安装:在cmd命令行中输入pip install jieba
使用:
jieba.lcut(s):精确模式,返回分词结果(列表)jieba.lcut(s,cut_all=True):全模式,返回所有可能的词语,存在冗余jieba.lcut_for_search(s):搜索引擎模式,在精确模的结果上进一步分词,存在冗余
wordcloud库
用于生成词云,需要安装Microsoft Visual C++ 14.0(也可以在https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloudshang 下载编译后的版本)。
w = wordcloud.WordCloud()
w.generate(txt) #加载文本txt
w.to_file(filename) #输出图像文件
设置大小:
w = wordcloud.WordCloud(width=600)
w = wordcloud.WordCloud(height=400)
w = wordcloud.WordCloud(min_font_size=10)
w = wordcloud.WordCloud(max_font_size=20)
w = wordcloud.WordCloud(font_step=2) #步进间隔
w = wordcloud.WordCloud(font_path="msyh.ttc") #字体
w = wordcloud.WordCloud(max_words=200) #最大单词数
w = wordcloud.WordCloud(stop_words={"ban_word"}) #禁词
w = wordcloud.WordCloud(background_color="white") #背景颜色(默认黑色)
其他库
Numpy:数据分析
Pandas:数据分析高层次应用库
SciPy:数学、科学和工程计算库
Matplotlib:二维数据可视化功能库
Seaborn:统计类数据可视化功能库
Mayavi:三维科学数据可视化功能库
PyPDF2:用于处理PDF文件的工具集
NLTK:自然语言文本处理
Python-docx:创建或更新.doc或.docx文件
Scikit-learn:机器学习方法工具库
TensorFlow:机器学习框架
MXNet:基于神经网络的深度学习计算框架
Requests:最友好的网络爬虫功能库
Scrapy:优秀的网络爬虫构架
pyspider:Web页面爬取系统
Beautiful Soup(beautifulsoup4或bs4):HTML和XML的解析库,需预先了解HTML和XML的设计原理,与网络爬虫库配合使用
Re:正则表达式解析和处理功能库(Re是标准库,无需安装)
Python-Goose:提取文章类型的Web页面的功能库
Django:略微复杂的Web应用框架
Pyramid:规模适中的Web应用框架
Flask:Web应用开发微框架
WeRoBot:解析、反馈微信消息
aip:百度AI开放平台接口
MyQR:生成二维码
PyQt5:Qt开发框架的Python接口
wxPython:跨平台GUI开发框架
PyGObject:使用GTK+(一种跨平台的用户图形界面GUI框架)开发GUI的功能库
PyGame:基于SDL的简单游戏开发功能库
Panda3D:开源、跨平台的3D渲染和游戏开发库(有C++和Python两种接口)
cocos2d:构建2D游戏和图形界面交互式应用的框架
Quads:迭代艺术图形
ascii_art:ASCII艺术库