计算机:功能性;可编程性
计算机的发展参照摩尔定律,表现为指数方式
程序设计,亦称编程
程序设计语言,亦称编程语言,程序设计的具体实现方式
计算机执行源程序的两种方式:编译和解释
源代码(人类可读) & 目标代码(人类不可读(专家除外))
编译:将源代码一次性转换成目标代码的过程 (英文翻译)
解释:将源代码逐条转换成目标代码同时逐条运行的过程(同声传译)
静态语言:使用编译执行的编程语言:C/C++语言、Java语言
脚本语言:使用解释执行的编程语言:Python语言、JavaScript语言、PHP语言
IPO
I:Input 输入,程序的输入
P:Process 处理,程序的主要逻辑
O:Output 输出,程序的输出
编程解决问题的步骤
求解计算问题的精简步骤
确定IPO、编写程序、调试程序
训练思维、增进认识、带来乐趣、提高效率、就业机会
#TempConvert.py
TempStr = input("请输入带有符号的温度值: ")
if TempStr[-1] in ['F', 'f']:
C = (eval(TempStr[0:-1]) - 32)/1.8
print("转换后的温度是{:.2f}C".format(C))
elif TempStr[-1] in ['C', 'c']:
F = 1.8*eval(TempStr[0:-1]) + 32
print("转换后的温度是{:.2f}F".format(F))
else:
print("输入格式错误")
代码高亮
缩进表达程序的格式框架,长度一致,程序内一致即可,一般用4个空格或1个TAB
注释
单行注释:以#开头,其后内容为注释
多行注释:以’’'开头和结尾
变量:用来保存和表示数据的占位符号
命名:关联标识符的过程
命名规则: 大小写字母、数字、下划线和中文等字符及组合
注意事项: 大小写敏感、首字符不能是数字、不与保留字相同
保留字:也叫关键字,基本单词,大小写敏感
字符串:由0个或多个字符组成的有序字符序列,由一对单引号或一对双引号表示,
数字类型:整数和浮点数都是数字类型
列表类型:由0个或多个数据组成的有序序列
列表使用[ ]表示,采用逗号(,)分隔各元素
使用保留字in 判断一个元素是否在列表中
input():从控制台获得用户输入的函数
input()函数的使用格式:
<变量> =input(<提示信息字符串>)
print():以字符形式向控制台输出结果的函数
print(<拟输出字符串或字符串变量>)
字符串类型的一对引号仅在程序内部使用,输出无引号
print("Hello:",i) # 其中的逗号有空格的作用
print('1' + '2')
print(chr(9800 + i), end="") # end可以设置输出是否换行,默认换行
print()函数的格式化
print("转换后的温度是{:.2f}C".format(C))
{ }表示槽,后续变量填充到槽中;{:.2f }表示将变量C填充到这个位置时取小数点后2位
eval():去掉参数最外侧引号并执行余下语句的函数
>>>eval("1")
1
>>>eval("1+2")
3
>>>eval('"1+2"')
'1+2'
>>>eval('print("Hello")')
Hello
1946-1981:计算机系统结构时代
1981-2008:网络和视窗时代
2008-2016:复杂信息系统时代
2017-:人工智能时代
各编程语言所处历史时期和使命不同,Python是计算时代演进的选择!
Python语言是通用语言
语法简洁、生态高产
人生苦短,我学Python
全栈能力
机器语言-汇编语言-高级语言-超级语言
#PythonDraw.py
import turtle
turtle.setup(650, 350, 200, 200)
turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25)
turtle.pencolor("purple")
turtle.seth(-40)
for i in range(4):
turtle.circle(40, 80)
turtle.circle(-40, 80)
turtle.circle(40, 80/2)
turtle.fd(40)
turtle.circle(16, 180)
turtle.fd(40 * 2/3)
turtle.done()
绝对坐标:turtle.goto(x, y)
海龟坐标:turtle.fd(d)
、turtle.bk(d)
、turtle.circle(r,angle)
绝对角度:seth()改变海龟行进方向:turtle.seth(angle)
seth()只改变方向但不行进
海龟角度:turtle.left(angle)
、turtle.right(angle)
默认采用小数值可切换为整数值,turtle.colormode(mode)
1.0:RGB小数值模式;255:RGB整数值模式
turtle.write(‘年’,font=(“Arial”, 18, “normal”))
turtle.hideturtle()
turtle.done()
import <库名> ;<库名>.<函数名>(<函数参数>)
from <库名> import<函数名>,from <库名> import *;<函数名>(<函数参数>)
给调用的外部库关联一个更短、更适合自己的名字
import <库名> as <库别名> ;<库别名>.<函数名>(<函数参数>)
turtle.penup() 别名 turtle.pu() 抬起画笔,海龟在飞行
turtle.pendown() 别名 turtle.pd() 落下画笔,海龟在爬行
画笔设置后一直有效,直至下次重新设置
turtle.pensize(width) 别名 turtle.width(width) 画笔宽度,海龟的腰围
turtle.pencolor(color) color为颜色字符串或r,g,b值 画笔颜色,海龟在涂装
pencolor(colorstring)
pencolor(r,g,b)
pencolor((r,g,b))
turtle.forward(d) 别名turtle.fd(d) 向前行进,海龟走直线
turtle.circle(r, extent=None) 根据半径r绘制extent角度的弧形
r: 默认圆心在海龟左侧r距离的位置
extent: 绘制角度,默认是360度整圆
for <变量> in range (<次数>):
<被循环执行的语句>
<变量>表示每次循环的计数,0到<次数>-1
可正可负,没有取值范围限制
pow(x,y)函数:计算 x y x^y xy ,想算多大算多大
4种进制表示形式
带有小数点及小数的数字
浮点数间运算存在不确定尾数
>>>0.1 + 0.3
0.4
>>>0.1 + 0.2
0.30000000000000004
round(x, d):对x四舍五入,d是小数截取位数
浮点数间运算与比较用round()函数辅助
浮点数可以采用科学计数法表示,使用字母e或E作为幂的符号,以10为基数,格式如下:
e 。4.3e-3值为0.0043 9.6E5值为960000.0
z= 1.23e-4+5.6e+89j
z.real获得实部,z.imag获得虚部
#DayDayUpQ1.py
dayup= pow(1.001, 365)
daydown= pow(0.999, 365)
print("向上:{:.2f},向下:{:.2f}".format(dayup, daydown))
#DayDayUpQ3.py
dayup= 1.0
dayfactor = 0.01
for i in range(365):
if i% 7 in [6,0]:
dayup= dayup*(1-dayfactor)
else:
dayup= dayup*(1+dayfactor)
print("工作日的力量:{:.2f}".format(dayup))
#DayDayUpQ4.py
def dayUP(df):
dayup= 1
for i in range(365):
if i % 7 in [6,0]:
dayup= dayup*(1 -0.01)
else:
dayup= dayup*(1 + df)
return dayup
dayfactor= 0.01
while dayUP(dayfactor) < 37.78:
dayfactor+= 0.001
print("工作日的努力参数是:{:.3f}".format(dayfactor))
字符串由一对单引号或一对双引号表示,字符串是字符的有序序列,可以对其中的字符进行索引,从0开始;
字符串有2类共4种表示方法:
由一对单引号或双引号表示,仅表示单行字符串
由一对三单引号或三双引号表示,可表示多行字符串(多行注释)
在字符串中包含双引号或单引号:
'这里有个双引号(")‘或者"这里有个单引号(’)"
‘’‘这里既有单引号(’)又有双引号(") ‘’’
字符串的使用:索引,返回字符串中单个字符;切片:返回字符串中一段字符子串。
使用[M:N: K]根据步长对字符串切片,M缺失表示至开头,N缺失表示至结尾,根据步长K对字符串切片;[::-1] 逆序
转义符\
转义符表达特定字符的本意,“这里有个双引号(”)"
转义符形成一些组合,表达一些不可打印的含义
“\b"回退,”\n"换行(光标移动到下行首),"\r"回车(光标移动到本行首)
从0到1114111(0x10FFFF)空间,每个编码对应一个字符
字符串格式化使用.format()方法,用法如下:
<模板字符串>.format(<逗号分隔的参数>)
>>>"{0:=^20}".format("PYTHON")
'=======PYTHON======='
>>>"{0:*>20}".format("BIT")
'*****************BIT'
>>>"{:10}".format("BIT")
'BIT '
>>>"{0:,.2f}".format(12345.6789)
'12,345.68'
>>>"{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}".format(425)
'110101001,Ʃ,425,651,1a9,1A9'
>>>"{0:e},{0:E},{0:f},{0:%}".format(3.14)
'3.140000e+00,3.140000E+00,3.140000,314.000000%'
f-string 格式化 就是在字符串模板前面加上f,然后占位符使用{} ,里面直接放入对应的数据对象。
f'税前薪资是:{salary}元, 缴税:{tax}元, 税后薪资是:{aftertax}元'
print(f'文章中 {{ 符号 出现了 {times1} 次')
Python解释器是3.6 以后的版本才支持,各种设置和format的槽内部是一样的。
采用 f-string 方式格式化的 字符串内容本身就有 {
或者 }
符号,一定要 双写
进行转义,否则会被当成是 格式化占位符。
提供系统级精确计时功能,用于程序性能分析
import time
time.<b>()
#TextProBarV1.py
import time
scale = 10
print("------执行开始------")
for i in range(scale+1):
a = '*'* i
b = '.'* (scale -i)
c = (i/scale)*100
print("{:^3.0f}%[{}->{}]".format(c,a,b))
time.sleep(0.1)
print("------执行结束------")
#TextProBarV2.py
import time
for i in range(101):
print("\r{:3}%".format(i), end="")
time.sleep(0.1)
IDLE屏蔽了\r功能
#TextProBarV3.py
import time
scale = 50
print("执行开始".center(scale//2,"-"))
start = time.perf_counter()
for i in range(scale+1):
a = '*'* i
b = '.'* (scale -i)
c = (i/scale)*100
dur= time.perf_counter() -start
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='')
time.sleep(0.1)
print("\n"+"执行结束".center(scale//2,'-'))
单分支结构
if <条件> :
<语句块>
二分支结构
if <条件> :
<语句块1>
else:
<语句块2>
二分支结构紧凑形式:适用于简单表达式的二分支结构
<表达式1> if <条件> else <表达式2>
print("猜{}了".format("对" if guess==99 else "错"))
多分支结构:
if <条件1> :
<语句块1>
elif <条件2> :
<语句块2>
……
else:
<语句块N>
<,<=,>=,>,==,!=
x and y,x or y,notx
try:
<语句块1>
except :
<语句块2>
try :
num= eval(input("请输入一个整数: "))
print(num**2)
except :
print("输入不是整数")
try:
<语句块1>
except <异常类型> :
<语句块2>
try :
num= eval(input("请输入一个整数: "))
print(num**2)
except NameError:
print("输入不是整数")
标注异常类型后,仅响应此类异常,异常类型名字等同于变量名。
异常处理的高级使用
try:
<语句块1>
except :
<语句块2>
else :
<语句块3>
finally :
<语句块4>
else对应语句块3在不发生异常时执行,finally对应语句块4一定执行
BMI:Body Mass Index
国际上常用的衡量人体肥胖和健康程度的重要标准,主要用于统计分析
定义:BMI = 体重(kg) / 身高2(m2)
height, weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]: "))
bmi = weight / pow(height, 2)
print("BMI 数值为:{:.2f}".format(bmi))
who, nat = "", ""
if bmi < 18.5:
who, nat = "偏瘦", "偏瘦"
elif 18.5 <= bmi < 24:
who, nat = "正常", "正常"
elif 24 <= bmi < 25:
who, nat = "正常", "偏胖"
elif 25 <= bmi < 28:
who, nat = "偏胖", "偏胖"
elif 28 <= bmi < 30:
who, nat = "偏胖", "肥胖"
else:
who, nat = "肥胖", "肥胖"
print("BMI 指标为:国际'{0}', 国内'{1}'".format(who, nat))
遍历某个结构形成的循环运行方式
for <循环变量> in <遍历结构> :
<语句块>
计数循环(N次)
for i in range(N):
<语句块>
计数循环(特定次)
for i in range(M,N,K):
<语句块>
字符串遍历循环:s是字符串,遍历字符串每个字符,产生循环
for c in s:
<语句块>
列表遍历循环:ls是一个列表,遍历其每个元素,产生循环
for item in ls:
<语句块>
文件遍历循环:fi是一个文件标识符,遍历其每行,产生循环
for line in fi:
<语句块>
反复执行语句块,直到条件不满足时结束
while <条件> :
<语句块>
CTRL + C
退出执行
循环与else
for <变量> in <遍历结构> :
<语句块1>
else:
<语句块2>
或
while <条件> :
<语句块1>
else:
<语句块2>
当循环没有被break语句退出时,执行else语句块
else语句块作为"正常"完成循环的奖励
for c in "PYTHON":
if c == "T":
continue
print(c, end="")
else:
print("正常退出")
>>> PYHON正常退出
for c in "PYTHON":
if c == "T":
break
print(c, end="")
else:
print("正常退出")
>>> PY
>>>import random
>>>random.seed(10)
>>>random.random()
0.5714025946899135
>>>random.seed(10)
>>>random.random()
0.5714025946899135
设置种子,产生的随机数就不变了。
π = ∑ k = 0 ∞ [ 1 1 6 k ( 4 8 k + 1 − 2 8 k + 4 − 1 8 k + 5 − 1 8 k + 6 ) ] \pi=\sum\limits_{k=0}^{\infty}[\frac{1}{16^k}(\frac{4}{8k+1}-\frac{2}{8k+4}-\frac{1}{8k+5}-\frac{1}{8k+6})] π=k=0∑∞[16k1(8k+14−8k+42−8k+51−8k+61)]
#CalPiV1.py
pi = 0
N = 100
for k in range(N) :
pi += 1/pow(16,k)*( \
4/(8*k+1) –2/(8*k+4) -\
1/(8*k+5) –1/(8*k+6))
print("圆周率值是: {}".format(pi))
代码后面增加斜杠\
换行
#CalPiV2.py
from random import random
from time import perf_counter
DARTS = 1000*1000
hits = 0.0
start = perf_counter()
for i in range(1, DARTS+1):
x, y = random(), random()
dist= pow(x ** 2 + y ** 2, 0.5)
if dist<= 1.0:
hits = hits + 1
pi = 4 * (hits/DARTS)
print("圆周率值是: {}".format(pi))
print("运行时间是: {:.5f}s".format(perf_counter()-start))
降低编程难度和代码复用
def <函数名>(<参数(0个或多个)>):
<函数体>
return <返回值>
函数定义时,所指定的参数是一种占位符
函数定义后,如果不经过调用,不会被执行
函数定义时,参数是输入、函数体是处理、结果是输出(IPO)
调用是运行函数代码的方式
调用时要给出实际参数
实际参数替换定义中的参数
函数调用后得到返回值
函数可以有参数,也可以没有,但必须保留括号
def <函数名>():
<函数体>
return <返回值>
可选参数传递,可选参数需要放在非可选参数后面,并且赋初值 def fact(n,m=1) :
def <函数名>(<非可选参数>,<可选参数>):
<函数体>
return <返回值>
def fact(n,m=1) :
s = 1
for i in range(1, n+1):
s *= i
return s//m
函数定义时可以设计可变数量参数,既不确定参数总数量
def <函数名>(<参数>, *b):
<函数体>
return <返回值>
def fact(n, *b) :
s = 1
for i inrange(1, n+1):
s *= i
for item in b:
s *= item
return s
fact(10,3,5,8)
函数调用时,参数可以按照位置或名称方式传递
def fact(n,m=1) :
fact(10,5 ) # 位置传递
fact( m=5,n=10 ) # 名称传递
函数可以返回0个或多个结果
函数可以有返回值,也可以没有,可以有return,也可以没有
return可以传递0个返回值,也可以传递任意多个返回值
return s//m, n, m
>>>fact(10,5 )
(725760, 10, 5) # 元组
>>>a,b,c= fact(10,5)
>>>print(a,b,c)
725760 10 5
<函数名> = lambda <参数>:<表达式>
等价于
def <函数名>(<参数>):
<函数体>
return <返回值>
>>>f = lambda x, y : x + y
>>>f(10, 15)
25
>>>f = lambda: "lambda函数"
>>>print(f())
lambda函数
Python map() 函数
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
map(function, iterable, ...)
>>> def square(x) : # 计算平方数
... return x ** 2
...
>>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方
<map object at 0x100d3d550> # 返回迭代器
>>> list(map(square, [1,2,3,4,5])) # 使用 list() 转换为列表
[1, 4, 9, 16, 25]
>>> list(map(lambda x: x ** 2, [1, 2, 3, 4, 5])) # 使用 lambda 匿名函数
[1, 4, 9, 16, 25]
Python 2.x 返回列表。Python 3.x 返回迭代器。
import turtle, time
def drawLine(draw): # 绘制单段数码管
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
turtle.right(90)
def drawDigit(digit): # 根据数字绘制七段数码管
drawLine(True) if digit in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if digit in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
drawLine(True) if digit in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if digit in [0, 2, 6, 8] else drawLine(False)
turtle.left(90)
drawLine(True) if digit in [0, 4, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if digit in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
drawLine(True) if digit in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
turtle.left(180)
turtle.penup() # 为绘制后续数字确定位置
turtle.fd(20) # 为绘制后续数字确定位置
def drawDate(date): #data为日期,格式为'%Y-%m=%d+'
turtle.pencolor("red")
for i in date:
if i== '-':
turtle.write('年',font=("Arial", 18, "normal"))
turtle.pencolor("green")
turtle.fd(40)
elif i== '=':
turtle.write('月',font=("Arial", 18, "normal"))
turtle.pencolor("blue")
turtle.fd(40)
elif i== '+':
turtle.write('日',font=("Arial", 18, "normal"))
else:
drawDigit(eval(i))
def main():
turtle.setup(800, 350, 200, 200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate(time.strftime('%Y-%m=%d+', time.gmtime()))
turtle.hideturtle()
turtle.done()
main()
函数定义中调用函数自身的方式
链条:计算过程存在递归链条
基例:存在一个或多个不需要再次递归的基例
递归是数学归纳法思维的编程体现
eg. 斐波那契数列、汉诺塔
(cmd命令行) pyinstaller -F <文件名.py>
pyinstaller –i curve.ico –F SevenDigitsDrawV2.py
科赫雪花
import turtle
def koch(size, n):
if n == 0:
turtle.fd(size)
else:
for angle in [0, 60, -120, 60]:
turtle.left(angle)
koch(size / 3, n - 1)
def main():
turtle.setup(800, 400)
turtle.penup()
turtle.goto(-300, -50)
turtle.pendown()
turtle.pensize(2)
koch(600, 3) # 3阶科赫曲线,阶数
turtle.hideturtle()
turtle.done()
main()
集合类型与数学中的集合概念一致
集合元素之间无序,每个元素唯一,不存在相同元素
集合元素不可更改,不能是可变数据类型
集合用大括号{} 表示,元素间用逗号分隔
建立集合类型用{} 或set()
建立空集合类型,必须使用set(),{}无法生成空集合,因为它生成了空字典
>>>A = {"python", 123, ("python",123)} #使用{}建立集合
{123, 'python', ('python', 123)}
>>>B = set("pypy123") #使用set()建立集合
{'1', 'p', '2', '3', 'y'}
>>>C = {"python", 123, "python",123}
{'python', 123}
try:
while True:
print(A.pop(), end="")
except:
pass
>>>ls = ["p", "p", "y", "y", 123]
>>>s = set(ls) # 利用了集合无重复元素的特点
{'p', 'y', 123}
>>>lt= list(s) # 还可以将集合转换为列表
['p', 'y', 123]
序列是一维元素向量,元素类型可以不同
元素间由序号引导,通过下标访问序列的特定元素
字符串类型、元组类型、列表类型
元组是一种序列类型,一旦创建就不能被修改
使用小括号() 或tuple() 创建,元素间用逗号, 分隔
可以使用或不使用小括号
>>>creature = "cat", "dog","tiger","human"
>>>creature
('cat', 'dog', 'tiger', 'human')
>>>color = (0x001100, "blue", creature)
>>>color
(4352, 'blue', ('cat', 'dog', 'tiger', 'human'))
列表是一种序列类型,创建后可以随意被修改
使用方括号[] 或list() 创建,元素间用逗号, 分隔
列表中各元素类型可以不同,无长度限制
sorted(ls):按递增顺序排序,列表被改变
List sort()方法
list.sort(cmp=None, key=None, reverse=False)
cmp – 可选参数, 如果指定了该参数会使用该参数的方法进行排序。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序, reverse = False 升序(默认)。
数据保护:如果不希望数据被程序所改变,转换成元组类型
def getNum(): # 获取用户不定长度的输入
nums = []
iNumStr = input("请输入数字(回车退出): ")
while iNumStr != "":
nums.append(eval(iNumStr))
iNumStr = input("请输入数字(回车退出): ")
return nums
def mean(numbers): # 计算平均值
s = 0.0
for num in numbers:
s = s + num
return s / len(numbers)
def dev(numbers, mean): # 计算方差
sdev = 0.0
for num in numbers:
sdev = sdev + (num - mean) ** 2
return pow(sdev / (len(numbers) - 1), 0.5)
def median(numbers): # 计算中位数
sorted(numbers)
size = len(numbers)
if size % 2 == 0:
med = (numbers[size // 2 - 1] + numbers[size // 2]) / 2
else:
med = numbers[size // 2]
return med
>>>d = {"中国":"北京","美国":"华盛顿","法国":"巴黎"}
>>>d
{'中国': '北京', '美国': '华盛顿', '法国': '巴黎'}
>>>d["中国"]
'北京'
>>> de = {} ; type(de) # 空字典
<class 'dict'>
>>>d = {"中国":"北京","美国":"华盛顿","法国":"巴黎"}
>>>"中国"in d
True
>>>d.keys()
dict_keys(['中国', '美国', '法国'])
>>>d.values()
dict_values(['北京', '华盛顿', '巴黎'])
>>>d = {"中国":"北京","美国":"华盛顿","法国":"巴黎"}
>>>d.get("中国","伊斯兰堡")
'北京'
>>>d.get("巴基斯坦","伊斯兰堡")
'伊斯兰堡'
>>>d.popitem()
('美国', '华盛顿')
元素遍历
for k in d:
<语句块>
文本去噪及归一化
使用字典表达词频
文本词频统计
def getText():
txt = open("hamlet.txt", "r").read()
txt = txt.lower()
for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
txt = txt.replace(ch, " ")
return txt
hamletTxt = getText()
words = hamletTxt.split()
counts = {}
for word in words:
counts[word] = counts.get(word, 0) + 1
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True) # 按照x的第1(从0开始)个元素排序
for i in range(10):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
import jieba
txt = open("threekingdoms.txt", "r", encoding="utf-8").read()
words = jieba.lcut(txt)
counts = {}
for word in words:
if len(word) == 1:
continue
else:
counts[word] = counts.get(word, 0) + 1
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)
for i in range(15):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
将词频与人物相关联,面向问题
import jieba
txt = open("threekingdoms.txt", "r", encoding="utf-8").read()
excludes = {"将军", "却说", "荆州", "二人", "不可", "不能", "如此"}
words = jieba.lcut(txt)
counts = {}
for word in words:
if len(word) == 1:
continue
elif word == "诸葛亮" or word == "孔明曰":
rword = "孔明"
elif word == "关公" or word == "云长":
rword = "关羽"
elif word == "玄德" or word == "玄德曰":
rword = "刘备"
elif word == "孟德" or word == "丞相":
rword = "曹操"
else:
rword = word
counts[rword] = counts.get(rword, 0) + 1
for word in excludes:
del counts[word]
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)
for i in range(10):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
文件是数据的抽象和集合
文件展现形态:文本文件和二进制文件
文本文件:由单一特定编码组成的文件,由于存在编码,也被看成是存储着的长字符串:.txt文件、.py文件等
二进制文件:直接由比特0和1组成,没有统一字符编码,.png文件、.avi文件等
文件处理的步骤:打开-操作-关闭
文件的打开
注意:Windows路径使用\
,\
在Python中为转义字符,所以用 /
或者 \\
表示 \
,
“D:/PYE/f.txt”;“D:\\PYE\\f.txt”;“f.txt”;"./PYE/f.txt"
<变量名>.close()
# 文本形式打开文件
tf= open("f.txt", "rt")
print(tf.readline())
tf.close()
# 二进制形式打开文件
bf = open("f.txt", "rb")
print(bf.readline())
bf.close()
注意:它们读完之后再读是接着后面读,不是从头开始,文件操作指针停在当前位置。
按数量读入,逐步处理
fname= input("请输入要打开的文件名称:")
fo= open(fname,"r")
txt = fo.read(2)
while txt != "":
#对txt进行处理
txt= fo.read(2)
fo.close()
一次读入,分行处理
fname= input("请输入要打开的文件名称:")
fo= open(fname,"r")
for line in fo.readlines():
print(line)
fo.close()
分行读入,逐行处理
fname= input("请输入要打开的文件名称:")
fo= open(fname,"r")
for line in fo:
print(line)
fo.close()
fo= open("output.txt","w+")
ls = ["中国","法国","美国"]
fo.writelines(ls)
for line in fo:
print(line)
fo.close()
>>> (没有任何输出)
fo= open("output.txt","w+")
ls = ["中国","法国","美国"]
fo.writelines(ls)
fo.seek(0)
for line in fo:
print(line)
fo.close()
>>> 中国法国美国
(以下内容参考http://www.python3.vip/tut/py/basic/13/)
如果我们开发的程序 在进行文件读写之后,忘记使用close方法关闭文件, 就可能造成意想不到的问题。
我们可以使用with 语句 打开文件,像这样,就不需要我们调用close方法关闭文件。 Python解释器会帮我们调用文件对象的close方法。
如下
# open返回的对象 赋值为 变量 f
with open('tmp.txt') as f:
linelist = f.readlines()
for line in linelist:
print(line)
对文件的操作都放在with下面的缩进的代码块中。
执行write方法写入字节到文件中的时候,其实只是把这个请求提交给 操作系统。
操作系统为了提高效率,通常并不会立即把内容写到存储文件中, 而是写入内存的一个 缓冲区
。
等缓冲区的内容堆满之后,或者程序调用close 关闭文件对象的时候,再写入到文件中。
如果你确实希望,在调用write之后,立即把内容写到文件里面,可以使用 文件对象的 flush方法f.flush()
。
#AutoTraceDraw.py
import turtle as t
t.title('自动轨迹绘制')
t.setup(800, 600, 0, 0)
t.pencolor("red")
t.pensize(5)
#数据读取
datals= []
f = open("data.txt")
for line in f:
line = line.replace("\n","")
datals.append(list(map(eval, line.split(","))))
f.close()
#自动绘制
fori in range(len(datals)):
t.pencolor(datals[i][3],datals[i][4],datals[i][5])
t.fd(datals[i][0])
if datals[i][1]:
t.right(datals[i][2])
else:
t.left(datals[i][2])
一维数据的读入处理:从空格分隔的文件中读入数据
txt= open(fname).read()
ls = txt.split()
f.close()
一维数据的写入处理:采用空格分隔方式将数据写入文件
ls = ['中国','美国','日本']
f = open(fname, 'w')
f.write(''.join(ls))
f.close()
CSV: Comma-Separated Values
国际通用的一二维数据存储格式,一般.csv扩展名
每行一个一维数据,采用逗号分隔,无空行
Excel和一般编辑软件都可以读入或另存为csv文件
如果某个元素缺失,逗号仍要保留
二维数据的表头可以作为数据存储,也可以另行存储
逗号为英文半角逗号,逗号与数据之间无额外空格
从CSV格式的文件中读入数据
fo= open(fname)
ls = []
for line in fo:
line = line.replace("\n","")
ls.append(line.split(","))
fo.close()
将数据写入CSV格式的文件
ls = [[],[],[]] #二维列表
f = open(fname, 'w')
for item inls:
f.write(','.join(item) + '\n')
f.close()
二维数据的逐一处理
ls = [[1,2],[3,4],[5,6]] #二维列表
for row in ls:
for column in row:
print(column)
import wordcloud
c = wordcloud.WordCloud() # 配置对象参数
c.generate("wordcloudby Python") # 加载词云文本
c.to_file("pywordcloud.png") # 输出词云文件
import wordcloud
txt = "life is short, you need python"
w = wordcloud.WordCloud(background_color= "white")
w.generate(txt)
w.to_file("pywcloud.png")
import jieba
import wordcloud
txt = "程序设计语言是计算机能够理解和\
识别用户操作意图的一种交互体系,它按照\
特定规则组织计算机指令,使计算机能够自\
动进行各种运算处理。"
w = wordcloud.WordCloud( width=1000,\
font_path="msyh.ttc",height=700)
w.generate(" ".join(jieba.lcut(txt)))
w.to_file("pywcloud.png")
政府工作报告等文 -> 有效展示的词云
import jieba
import wordcloud
f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
w = wordcloud.WordCloud(font_path="msyh.ttc",
width=1000, height=700, background_color="white",
stopwords={'的', '和', '是', '在', '以', '为', '对'})
w.generate(txt)
w.to_file("grwordcloud.png")
from imageio import imread
mask = imread("5.png")
体育竞技分析:模拟N场比赛
自顶向下(分而治之)
自底向上(执行)(模块化集成)
逻辑思维:推理和演绎,数学为代表,A->B B->C A->C
实证思维:实验和验证,物理为代表,引力波<-实验
计算思维:设计和构造,计算机为代表,汉诺塔递归
Computational Thinking 抽象问题的计算过程,利用计算机自动化求解
方法1:进度展示
方法2:异常处理
其他类方法
pip –h
pip install <第三方库名> # 安装指定的第三方库
pip install –U <第三方库名> # 使用-U标签更新已安装的指定第三方库
pip uninstall <第三方库名> # 卸载指定的第三方库
pip download <第三方库名> # 下载但不安装指定的第三方库
pip show <第三方库名> # 列出某个指定第三方库的详细信息
pip search <关键词> # 根据关键词在名称和介绍中搜索第三方库
pip list # 列出当前系统已经安装的第三方库
http://www.lfd.uci.edu/~gohlke/pythonlibs/
pip install <文件名>
Python官方文档:https://docs.python.org/zh-cn/3/
os库提供通用的、基本的操作系统交互功能
os.path子库以path为入口,用于操作和处理文件路径
import os.path
import os.path as op
os.system(command)
import os
os.system("C:\\Windows\\System32\\calc.exe")
>>>
0 # 调用成功,返回0
#BatchInstall.py
import os
libs = {"numpy","matplotlib","pillow","sklearn","requests",\
"jieba","beautifulsoup4","wheel","networkx","sympy",\
"pyinstaller","django","flask","werobot","pyqt5",\
"pandas","pyopengl","pypdf2","docopt","pygame"}
try:
for lib in libs:
os.system("pip install " + lib)
print("Successful")
except:
print("Failed Somehow")
Numpy
: 表达N维数组的最基础库
Pandas
: Python数据分析高层次应用库
SciPy
: 数学、科学和工程计算功能库
Matplotlib
: 高质量的二维数据可视化功能库
Seaborn
: 统计类数据可视化功能库
Mayavi
:三维科学数据可视化功能库
PyPDF2
:用来处理pdf文件的工具集
NLTK
:自然语言文本处理第三方库
Python-docx
:创建或更新Microsoft Word文件的第三方库
Scikit-learn
:机器学习方法工具集
TensorFlow
:机器学习计算框架
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family'] = 'SimHei'
radar_labels = np.array(['研究型(I)', '艺术型(A)', '社会型(S)',
'企业型(E)', '常规型(C)', '现实型(R)'])
data = np.array([[0.40, 0.32, 0.35, 0.30, 0.30, 0.88],
[0.85, 0.35, 0.30, 0.40, 0.40, 0.30],
[0.43, 0.89, 0.30, 0.28, 0.22, 0.30],
[0.30, 0.25, 0.48, 0.85, 0.45, 0.40],
[0.20, 0.38, 0.87, 0.45, 0.32, 0.28],
[0.34, 0.31, 0.38, 0.40, 0.92, 0.28]]) # 数据值
data_labels = ('艺术家', '实验员', '工程师', '推销员', '社会工作者', '记事员')
angles = np.linspace(0, 2 * np.pi, 6, endpoint=False)
data = np.concatenate((data, [data[0]]))
angles = np.concatenate((angles, [angles[0]]))
radar_labels = np.concatenate((radar_labels, [radar_labels[0]]))
fig = plt.figure(facecolor="white")
plt.subplot(111, polar=True)
plt.plot(angles, data, 'o-', linewidth=1, alpha=0.2)
plt.fill(angles, data, alpha=0.25)
plt.thetagrids(angles * 180 / np.pi, radar_labels)
plt.figtext(0.52, 0.95, '霍兰德人格分析', ha='center', size=20)
legend = plt.legend(data_labels, loc=(0.94, 0.80), labelspacing=0.1)
plt.setp(legend.get_texts(), fontsize='large')
plt.grid(True)
plt.savefig('holland_radar.jpg')
plt.show()
Requests
: 最友好的网络爬虫功能库
Scrapy
: 优秀的网络爬虫框架
pyspider
: 强大的Web页面爬取系统
Beautiful Soup
: HTML和XML的解析库
Re
: 正则表达式解析和处理功能库
Python-Goose
:提取文章类型Web页面的功能库
Django
: 最流行的Web应用框架
Pyramid
: 规模适中的Web应用框架
Flask
: Web应用开发微框架
WeRoBot
: 微信公众号开发框架
aip
: 百度AI开放平台接口
MyQR
: 二维码生成第三方库
PyQt5
: Qt开发框架的Python接口
wxPython
: 跨平台GUI开发框架
PyGObject
: 使用GTK+开发GUI的功能库
PyGame: 简单的游戏开发功能库
Panda3D
:开源、跨平台的3D渲染和游戏开发库
cocos2d
: 构建2D游戏和图形界面交互式应用的框架
VR Zero
: 在树莓派上开发VR应用的Python库
pyovr
: Oculus Rift的Python开发接口
Vizard
: 基于Python的通用VR开发引擎
Quads
: 迭代的艺术
ascii_art
: ASCII艺术库
turtle
: 海龟绘图体系
略