声明:
1、本文依据Mooc课程“Python语言程序设计”,北理工嵩天老师的课程。
2、推荐这门课作为一些非计算机专业学习,内容深入浅出,而且结合简单的实际应用进行讲解。
3、课程笔记,学习专用,未完,持续更新,后续学习进阶版也会更新。
4、欢迎学习交流,转载请先联系作者,盗版必究,尊重知识。
#功能性:对数据的操作表现为数据计算、输入、输出和结果储存等
#可编程性:根据一系列指令自动地、可预测的、准确的完成操作者的意图。
计算机史上最重要的预测法则:单位面积集成电路上可容纳晶体管的数量约每两年翻一番。
计算机发展是以指数方式的发展。
python诞生于1990年,是当今最好用的语言。
将源代码(人类可读)与目标代码(机器和某些顶尖专家可读)相互转换
#编译:将源代码一次性转换成目标代码的过程,使用编译执行的编程语言,如c、c++、Java等静态语言
静态语言 编译器一次性生成目标代码,优化充分,运行快
#解释:将源代码逐条转换为目标代码并同时逐条运行的过程,使用解释执行的编程语言称为脚本语言,如Python、js、php
脚本语言 执行程序时需要源代码,维护更灵活,可以跨多个操作系统平台
#IPO
I–input输入,程序的输入:文件、网络、控制台、交互界面、程序内部输入等
P–Process处理,程序的主要逻辑:算法
O–output输出,程序的输出:展示运算结果的方式
Python意为忙着,属于PSF,PSF是一个致力于保护Python语言开放、开源和发展的非营利组织。python的创始者是Guido。
网上方法很多,自己去学学即可。
交互式和文件式
对每个输入语句即时运行结果,适合语法练习
批量执行一组语句并运行结果,编程的主要方式
输入输出格式:82F–华氏82度,28C–摄氏28度
算法设计:根据转换公式:C=(F-32)/1.8,F=C*1.8+32
#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
#开头,其后内容为注释,单行注释;’’'开头和结尾表示多行注释
用来保存和表示数据的占位符号
大小写字母、数字、下划线、汉字等字符的组合
注意事项:大小写敏感、首字母不能是数字,不与保留字相同
编程语言内部定义的并保留使用的标识符,即关键词
and | elif | import | raise | global |
---|---|---|---|---|
as | else | in | return | nonlocal |
assert | except | is | try | True |
break | finally | lambda | while | False |
class | for | not | with | None |
continue | from | or | yield | |
def | if | pass | del |
供计算机程序理解的数据形式
-整数类型 10011101
-字符串类型 “10,011,101”
-列表类型 [10,011,101]
正向增序序号:从0开始
反向递减序号:-12,-11.。。,-1,保证最后一个为-1
有判断条件决定程序运行方向的语句,例如if,elif,else
根据输入参数不同输出结果
#python输入和输出
从控制台输入
以字符串型是向控制台输出结果
print()函数的格式化
print("转换后温度是{:.2f}C".format(C))
评估函数,去掉参数最外侧引号并执行余下语句的函数
如eval(“1+2”)会得到3
1946-1981年计算机系统结构时代:计算能力问题
1981-2008网络和视窗时代:交互问题
2008-2016安卓系统产生,复杂信息时代:数据问题
2016-?人工智能时代:计算能力问题、人类的问题
#高级语言 接近自然语言,编译器,与cpu幸好无关
#汇编语言 有助记符,汇编器,与cpu型号有关
#机器语言 代码直接执行,与cpu型号有关
#超级语言 Python是目前唯一的超级语言
#PythonDraw.py
import turtle
turtle.setup(650,350,200,200)
turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25)
turtle.pencolor("red")
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,100)
turtle.fd(40*2/3)
turtle.done()
1969年诞生的海龟库,有一只海龟,在窗体正中心,在画布上游走,走过的轨迹形成了绘制的图形
-setup()设置窗体大小及位置
-4个参数中后两个可选,分别表示长、宽、左上角x/y坐标
-setup()不是必须的
turtle的空间坐标是绝对坐标,窗体中心为海归起始位置(0,0)
turtle.goto(x,y)表示走向
海龟是头朝右的乌龟
turtle.fd(d)朝海龟正前方
turtle.bk(d)朝海龟后方
turtle.circle(r,angle)朝海龟左侧沿距离r的原点绕行
turtle.seth(angle)改变海归方向,但不行进
turtle.colormode(mode)
import <库名>
<库名>.<函数名>(<函数参数>)
import <库名> as <库别名>
<库别名>.<函数名>(<函数参数>)
from <库名> import <函数名>
from <库名> import *
<函数名>(<函数参数>)
turtle.penup()#表示画笔抬起,海龟在飞行,别名turtle.pu()
turtle.pendown()#画笔落下,海龟在爬行,别名turtle.pd()
turtle.pensize(25)#画笔的宽度,别名turtle.width()
turtle.pencolor("red")#设置画笔颜色
pow(x,y) x的y次方
十进制:99
二进制,以0b或者0B开头:0b010,-0B101
八进制,以0o或者0O开头:0o123,-0O456
十六进制,以0x或者0X开头:0x9a,-0X89
浮点数的小数部分二进制与十进制并不是一一对应,存在不确定尾数
例如输入0.1+0.2==0.3会显示false,但可以使用round解决,round(0.1+0.2)==0.3会显示true
round(x,d)对x四舍五入。d是小数截取位数
定义与数学相同
z.real获得实部,z.imag获得虚部,z为复数
+、-、*、/
x//y整数除,得到整数商
%取余
x**y=pow(x,y)但前者x,y为整数,后者不需要
x op=y与x=x op y相同
abs(x) 求x的绝对值
divmod(x,y) 同时输出商和余数divmod(10,3)=(3,1)
pow(x,y[,z]) 表示(x**y)%z,例如pow(3,pow(3,9),10000)结果为4587
round(x[,d]) 四舍五入,d是保留小数数位
max/min(1,2,4,3,5)
#DayDayupandDownQ3.py
def dayUp(df):
day = 1
for i in range(365):
if ((i + 1) % 7 == 6 or (i + 1) % 7 == 0):
day *= (1 - df)
else:
day *= (1 + df)
return day
dayfactor = 0.01
while dayUp(dayfactor) < 37.78:
dayfactor += 0.001
print("一年365天:{:.3f}".format(dayfactor))
字符串有2类共4种,表示方法
由一对单引号或双引号表示,仅表示单行字符串
"这里阿拉法凉山大火"
或者'C:'
-如果希望在字符串中包含双引号或者单引号的表示方法:
'这里有个双引号(")'
或者"这里有个单引号(')"
-如果希望文本中出现单引号和双引号
'''这里既有单引号(')又有双引号(")'''
-索引:返回字符串中单个字符 <字符串>[M]
"请输入带有符号的温度值:"[0]
或者TempStr[-1]
-切片返回字符串中一段字符子串 <字符串>[M:N]
"请输入带有符号的温度值:"[1:3]
或者TempStr[0:-1]
使用[M:N:K]根据步长对字符串切片
-<字符串>[M:N:K],根据步长K对字符串切片
"0123456789"[1:8:2]
结果是"1357"
-<字符串>[M:N] M缺失表示至开头,N缺失表示至结尾
"01234567"[:3]
结果是"012"
-表达特定字符的本意
"这里有个双引号(\")"
结果为 这里有个双引号(")
-转义符形成一些组合,表达一些不可打印的含义
“\b” 回退
“\n” 换行,光标移动到下行首
“\r” 回车,光标移动到本行首
x+y表示连接
n*x或者
x*n表示复制n次字符串x
x in s如果x是s的子串,返回True,否则返回False
例子
#WeekNamePrintV2.py
weekStr = "一二三四五六七"
weekId = eval(input("请输入星期数字(1-7):"))
print("星期"+weekStr[weekId-1])
函数及使用 | 描述 |
---|---|
len(x) | 长度 |
str(x) | 任意类型转换为字符串类型,包括列表 |
hex(x)或者oct(x) | 将十进制整数变成十六进制或八进制小写形式字符串,例如hen(425)=“0x1a9”, oct(425)=“0o651” |
chr(u) | u为Unicode编码,返回其对应字符,如char(10004)为"√" |
ord(x) | x为字符,返回其对应的Unicode编码 |
举例:
for i in range(9800,9812):
print(chr(i),end=" ")
输出星座符号:
♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓
方法及使用 | 描述 |
---|---|
str.lower()或者str.upper() | 返回字符串的副本,全部字符小写/大写"ahaBJOIHLADShjl".lower()结果为全部小写 |
str.split(sep=None) | 返回一个列表,由str根据被sep分割的部分组成。“A,B,C”.split(",")结果为[‘A’,‘B’,‘C’] |
str.count(sub) | 返回子串sub在str中出现的次数。“an apple a day”.count(“a”)结果为4 |
str.replace(old,new) | 旧字符串替换为新字符串 |
str.center(width[,fillchar]) | 字符串str根据宽度width居中,fillchar可选"python".center(20,"=")结果为"=python=" |
str.strip(chars) | 从str中去掉其左侧和右侧chars中列出的字符"= python".strip(" =np")结果为"ytho" |
str.join(iter) | 在iter变量除最后元素外每一个元素后增加一个str。例如",".join(“12345”)结果为"1,2,3,4,5",#主要用于字符串分隔等 |
其使用方法是.format(),具体用法如下:
<模板字符串>.format(<逗号分隔的参数>)
"{}:计算机{}的cpu占用率为{}%".format("2018-10-10","c",10)
"{0}:计算机{1}的cpu占用率为{2}%".format("2018-10-10","c",10)
槽内部对格式化的配置方法:
{<参数序号>:<格式控制标记>}
: | <填充> | <对齐> | <宽度> | <,> | <.精度> | <类型> |
---|---|---|---|---|---|---|
引导符号 | 用于填充的单个字符 | <左 >右 ^居中对齐 | 槽设定的输出宽度 | 数字的千位分隔符 | 浮点数小数精度或者字符串最大输出长度 | 整数类型b,c,d,o,x,X浮点数类型e,E,f,% |
"{0:=^20}".format("Python")
= 填充符号,空余空间填充
^ 居中对齐
20 长度/宽度20
输出 =======Python=======
print("{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}".format(425))
110101001,Ʃ,425,651,1a9,1A9
time库是Python中处理时间的标准库:
-计算机时间的表达
-提供获取系统时间并格式化输出的功能
-提供系统精确计时功能,用于程序性能分析
函数 | 描述 |
---|---|
time() | 获取当前时间戳,即计算机内部时间值,浮点数 |
ctime() | 获取当前时间并以易读方式表示,返回字符串 |
gmtime() | 获取当前时间表示为计算机可以处理的时间格式 |
import time
print(time.time())
print(time.ctime())
print(time.gmtime())
#输出结果:1599469094.3461773
#输出结果:Mon Sep 7 17:05:08 2020
#输出结果:time.struct_time(tm_year=2020, tm_mon=9, tm_mday=7, tm_hour=9, tm_min=2, tm_sec=26, tm_wday=0, tm_yday=251, tm_isdst=0)
时间戳表示的是1970年1月1日到当前这一时刻为止以秒为单位的时间
-格式化:类似于字符串格式化,需要由展示模板
-展示模板由特定的格式化控制符组成
函数 | 描述 |
---|---|
strftime(tpl,ts) | tpl是格式化模板字符串,用来定义输出效果。ts是计算机内部时间类型变量 |
strptime(tpl,ts) | str是字符串形式的时间值,tpl是格式化模板字符串,用来定义输入效果 |
import time
t = time.gmtime()
print(time.strftime("%Y-%m-%d-%H:%M:%S",t))
timestr = '2020-09-07 09:16:51'
print(time.strptime(timestr,"%Y-%m-%d %H:%M:%S"))
#输出结果:2020-09-07-09:15:50
#输出结果:time.struct_time(tm_year=2020, tm_mon=9, tm_mday=7, tm_hour=9, tm_min=16, tm_sec=51, tm_wday=0, tm_yday=251, tm_isdst=-1)
格式化字符串 | 日期/时间说明 | 值范围和实例 |
---|---|---|
%Y | 年份 | 0000~9999,例如2020 |
%m | 月份 | 01~12 |
%B | 月份名称 | January~December |
%b | 月份名称缩写 | Jan~Dec |
%d | 日期 | 01~31 |
%A | 星期 | Monday~Sunday |
%a | 星期缩写 | Mon~Sun |
%H | 24小时制 | 00~23 |
12小时制 | 01~12 | |
上/下午 | AM,PM,例如:PM | |
%M | 分钟 | 00~59 |
%S | 秒 | 00~59 |
sleep() 产生时间
perf_counter() 测量时间
函数 | 描述 |
---|---|
perf_counter() | 返回一个CPU级别的精确时间计数值,单位为秒,其起点不确定,需连续调用差值才有意义 |
import time
start = time.perf_counter()
time.sleep(2.2)
end = time.perf_counter()
print(end - start)
#输出:2.1999606000000003
#TextProBarV1.py
import time
scale = 10
print("{0:-^20}".format("执行开始"))
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.5)
print("{0:-^20}".format("执行结束"))
#输出结果:
--------执行开始--------
0%[->..........]
10%[*->.........]
20%[**->........]
30%[***->.......]
40%[****->......]
50%[*****->.....]
60%[******->....]
70%[*******->...]
80%[********->..]
90%[*********->.]
100%[**********->]
--------执行结束--------
import time
for i in range(101): print("\r{:3}%".format(i),end="")
time.sleep(0.1)
#TextProBarV2.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>
if <条件1>:
<语句块1>
elif <条件2>:
<语句块2>
.......
else:
<语句块n>
and、or、not
try:
<语句块1>
except:
<语句块2>
or
try:
<语句块1>
except <异常类型>:
<语句块2>
try:
<语句块1>
except:
<语句块2>
else:
<语句块3> #此语句在不发生异常时执行
finally:
<语句块4> #此语句一定会执行
#CalBMI_V1.py
height, weight = eval(input("请输入身高(米)和体重(kg),并使用逗号隔开:"))
bmi = weight/pow(height,2)
print("BMI数值为:{0:.2f}".format(bmi))
if bmi <18.5:
who1 = "偏瘦"
who2 = "偏瘦"
elif 18.5<=bmi<24:
who1 = "正常"
who2 = "正常"
elif 24<=bmi<25:
who1 = "正常"
who2 = "偏胖"
elif 25<=bmi<28:
who1 = "偏胖"
who2 = "偏胖"
elif 28<=bmi<30:
who1 = "偏胖"
who2 = "肥胖"
else:
who1 = "肥胖"
who2 = "肥胖"
print("BMI指标为:国际{},国内{}".format(who1,who2))
#输出结果:
请输入身高(米)和体重(kg),并使用逗号隔开:1.81,85
BMI数值为:25.95
BMI指标为:国际偏胖,国内偏胖
for <循环遍历> in <遍历结构>:
<语句块>
for c in s: #s是字符串,c表示一个可以装字母的容器,此句话意思是遍历字符串每一个字符
<语句块>
for item in []:
<语句块>
for line in file:
<语句块>
while <条件>:
<语句块>
一直运行,直到不满足while条件
break 和 continue
break跳出并结束当前循环,执行循环后的语句,break只能跳出一层循环
continue跳出当次循环,继续执行后续次数循环
for <> in <>:
<>
else:
<>
or
while <>:
<>
else:
<>
上述语句表示,如果没有执行break,程序正常执行,则会继续执行else,否则不会执行
random库是使用随机数的Python标准库,无需安装
-其产生的随机数并不随机,而是一种伪随机数,是采用梅森旋转算大生成的(伪)随机序列中的元素
函数 | 描述 |
---|---|
seed(a=None) | 初始化给定的随机数种子,默认为当前系统时间,random.seed(10)#产生种子10的对应的序列 |
random() | 生成一个(0.0,1.0)之间的随机小数 |
randint(a,b) | 生成一个[a,b]之间的整数 |
randrange(m,n[,k]) | 生成一个[m,n)之间以k为步长的随机整数 |
getrandbits(k) | 生成一个k bit长的随机整数 |
uniform(a,b) | 生成一个[a,b]之间的随机小数 |
choice(seq) | 从列表seq[]中随机选择一个元素 |
shuffle(seq) | 将列表seq[]中元素随机排列,返回打乱后的序列 |
import random
random.seed(10)
print(random.random())
#输出结果:0.5714025946899135
默认种子为当前系统时间,如果设定种子,则随机过程可以再现
数学家们给出了圆周率的计算公式:
公式太长,请自己百度一下,本次编程采用此公式
工程上的蒙特卡罗方法:
直径为d的圆与边长为d的正方形的1/4中撒点,那么数量足够多时可算出圆与正方形的面积比,进而计算出圆周率
#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))
#圆周率:3.141592653589793
#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):
x, y = random(), random()
dist = pow(x**2+y**2, 0.5)
if dist <= 1.0:
hits += 1
pi = 4*(hits/DARTS)
print("Pi是:{}".format(pi))
print("运行时间:{}".format(perf_counter()-start))
#输出结果:
Pi是:3.14006
运行时间:0.5747372
函数是一段代码的表示,即Java里的方法,它具有特定功能,可以通过函数名的调用而重复使用该函数所包含的代码。
def <函数名>(<参数可有可无,但括号必须带>):
<函数体>
return <返回值>
def <函数名>(<非可选参数>,<可选参数>):
<函数体>
return <返回值>
非可选参数也叫必选参数,可选参数给出默认值,如果没有给可选参数赋予新值,则会使用默认参数
例如计算n!//m
def fact(n,m=1): #n为非可选参数,m为可选,如果在函数调用时不传入m值,则会默认为1,传入新值则为新值
s = 1
for i in range(1,n+1):
s *=i
return s//m
函数定义时可以设计可变数量参数,即不确定参数总数量
def <函数名>(<参数>,*b):
<函数体>
return <返回值>
计算n!的乘数
def fact(n,*b)
s = 1
for i in range(1,n+1):
s *= i
for item in b:
s *= item
return s
实例:
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))
#输出结果:435456000
作用在整个程序中的变量
仅在函数体内部使用的变量
规则一:局部变量用于函数体内部,全局变量用于整个程序,当二者相同时,函数内部为局部变量,但可以使用global修饰,使局部变量变为全局变量
规则二:局部变量为组合数据且未创建,等同于全局变量
ls = ['F', 'f']
def func(a):
ls.append(a)
return
func("C")
rint(ls)
#输出:['F', 'f', 'C']
#当func(c)中加一行ls = [],输出结果为['F', 'f']
lambda函数返回函数名作为结果
-lambda函数是一种匿名函数,即没有名字的函数
-使用lambda保留字定义,函数名是返回结果
-lambda函数用于定义简单的,能够在一行内表示的函数
<函数名> = lambda<参数>:<表达式>
#等价于
def <函数名>(<参数>):
<函数体>
return <返回值>
例子
f = lambda x, y : x+y
print(f(10,15))
#输出结果为25
#七段灯管v1
import turtle
def drawLine(draw):
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
turtle.right(90)
def drawDight(dight):
drawLine(True) if dight in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if dight in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
drawLine(True) if dight in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if dight in [0, 2, 6, 8] else drawLine(False)
turtle.left(90)
drawLine(True) if dight in [0, 4, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if dight in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
drawLine(True) if dight in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
turtle.left(180)
def drawDate(date):
for i in date:
drawDight(eval(i))
turtle.penup()
turtle.fd(10)
turtle.pendown()
def main():
turtle.setup(800, 350, 200, 200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate("20181010")
turtle.done
main()
#七段灯管v2
import turtle
import time
def drawGap():
turtle.penup()
turtle.fd(5)
def drawLine(draw):
drawGap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
drawGap()
turtle.right(90)
def drawDight(dight):
drawLine(True) if dight in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if dight in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
drawLine(True) if dight in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if dight in [0, 2, 6, 8] else drawLine(False)
turtle.left(90)
drawLine(True) if dight in [0, 4, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if dight in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
drawLine(True) if dight in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
turtle.left(180)
def drawDate(date):
turtle.pencolor("red")
for i in date:
if i == '-':
turtle.write('年', font = ("Arial", 18, "normal"))
turtle.pencolor("green")
turtle.penup()
turtle.fd(40)
elif i == '=':
turtle.write("月", font = ("Arial", 18, "normal"))
turtle.pencolor("blue")
turtle.penup()
turtle.fd(40)
elif i == '+':
turtle.write("日", font=("Arial", 18, "normal"))
else:
drawDight(eval(i))
turtle.penup()
turtle.fd(10)
turtle.pendown()
def main():
turtle.setup(800, 350, 200, 200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
t = time.gmtime()
date = time.strftime("%Y-%m=%d+", t)
drawDate(date)
turtle.hideturtle()
turtle.done
main()
代码资源化:程序代码是一种用来表达计算的资源
代码抽象化:使用函数等方法对代码赋予更高级别的定义
代码复用:同一份代码在需要时可以被重复使用
函数 和 对象 是代码服用的两种主要形式
函数:将代码命名,在代码层面建立了初步抽象
对象:属性和方法.和.(),在函数之上再次组织进行抽象
通过函数或者对象封装将程序划分为模块及模块间的表达,具体包括:主程序、子程序和子程序之间的关系
一种分而治之、分层抽象、体系化的设计思想
函数定义中调用自身的形式
计算过程中存在递归链条
存在一个或多个不需要再次递归的基例
函数+分支语句
递归本身就是一个函数,函数内部需要分支语句对输入参数进行判断。
#字符串反转
def rvs(s):
if s == "":
return s
else:
return s[-1]+rvs(s[:-1])
print(rvs("akjvkavsdkfvdsgkajsf"))
#hanoi
count = 0
def hanoi(n, A, B, C):
global count
if n == 1:
print(A, '-->', C)
count += 1
else:
hanoi(n - 1, A, C, B)
print(A, '-->', C)
count += 1
hanoi(n - 1, B, A, C)
def main():
n = eval(input("输入层数:"))
A = 'A'
B = 'B'
C = 'C'
hanoi(n, A, B, C)
print(count)
main()
可以将.py源代码转换成无需源代码的可执行文件
-.py --> PyInstaller -->Windows、Linux、Mac OS X系统不安装python时也能执行文件
在cmd中输入代码pip install pyinstaller
C:\Users\MiuRui>pip install pyinstaller
pyinstaller是命令行语言,只能在cmd中执行,而不能在编译器或者python自带的idle界面运行
1、找到所需转化程序代码的文件位置,然后控制cmd进入该目录
cd <文件位置>,位置不同,找到自己的路径即可
C:\Users\MiuRui>d:
D:\>cd D:\Code_Data\PythonPycharm
D:\Code_Data\PythonPycharm>
2、输入代码pyinstaller -F <文件名>
D:\Code_Data\PythonPycharm>pyinstaller -F SevenDightsDraw.py
执行这段代码后,目录中生成了额外的三个目录__pycache__、build、dist,其中的__pycache__、build可以删除,在dist中有一个同名文件,即是转化好的程序。
参数 | 描述 |
---|---|
-h | 查看帮助 |
–clean | 清理打包过程中的临时文件 |
-D, --onedir | 默认值,生成dist文件夹,不推荐 |
-F, --onefile | 在dist文件夹中只生成独立的打包文件 |
-i <图标文件名.ico> | 制定打包程序使用的图标(icon)文件 |
用python绘制科赫曲线
#KochDrawV1.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():#设置窗口大小、起点位置、size、color
turtle.setup(600, 600, 200, 100)
turtle.penup()
turtle.goto(-200, 100)
turtle.pendown()
turtle.pensize(2)
level = 3
koch(400, level)
turtle.right(120)
koch(400, level)
turtle.right(120)
koch(400, level)
turtle.hideturtle()
turtle.done()
main()
集合是多个元素的无需组合,元素不可重复,且是不可变类型
操作符及应用 | 描述 |
---|---|
S|T | 返回并集 |
S-T | 差集,返回一个新集合,包含在S中但不在T中的元素 |
S&T | 返回交集 |
S^T | 补集,返回新集合,包括集合S和T中的非相同元素 |
S<=T或S返回True/False,判断S和T的子集关系 |
|
S>=T或S>T | 返回True/False,判断S和T的包含关系 |
操作函数或方法 | 描述 |
---|---|
S.add(x) | 如果x不在集合S中,将x增加到S |
S.discard(x) | 移除S中的元素x,如果x不在集合中,不报错 |
S.remove(x) | 移除S中的元素x,如果x不在集合中,产生keyerror异常 |
S.clear() | 移除所有元素 |
S.pop() | 随机返回S的一个元素,更新S,若S为空产生KeyError异常 |
S.copy() | 返回集合S的一个副本 |
len(S) | 返回集合S的个数 |
x in S | 布尔类型 |
x not in S | 布尔类型 |
集合类型中所有元素均不重复
ls = ["p", "p", "y", "y", 123]
s = set(ls)
print(s)
lt = list(s)
序列是具有先后关系的一组元素,序列是一个基类类型,是以为元素向量,元素类型可以不同,元素间由序号引导,通过下标访问序列的特定元素。
字符串类型、元组类型、列表类型是序列类型的衍生,序列类型性的操作,都可以在上述三种类型中进行。
操作符及应用 | 描述 |
---|---|
x in S | 布尔类型 |
x not in S | |
S+T | 连接序列 |
S*n或者反过来 | 将序列S复制n次 |
S[i] | 索引,返回s中的第i个元素,i是序列的序号 |
S[i:j] S[i:j:k] | 切片操作,返货序列s中i到j以k为步长的元素的子序列 |
ls[::-1] #列表中的反转操作
函数和方法 | 描述 |
---|---|
len(s) | 返回序列s的长度 |
min(s) | 返回序列s的最小元素,s中元素需要可比较 |
max(s) | |
s.index(x)或者s.index(x, i, j) | 返回序列s从i到j位置中第一次出现元素x的位置 |
s.count(x) | 序列s中出现x的总次数 |
元组类型是一种序列类型,一旦创建不可更改,使用()或者tuple()创建,元素间用逗号,分隔。也可以不使用()
creature = "cat", "dog", "tiger", "human"
print(creature)
#输出:('cat', 'dog', 'tiger', 'human')
creature[::-1]
列表类型是一种序列类型,创建后可以被更改,使用[]或者list()创建,元素间用逗号分隔
列表中元素类型可以不同,且没有长度限制
函数和方法 | 描述 |
---|---|
ls[i] = x | 替换列表ls序号为i的元素为x |
ls[i: j: k] = lt | 将列表lt替换ls切片后所对应元素的子序列 |
del ls[i] | 删除列表中第i元素 |
del ls[i: j: k] | 删除列表中ls中第i到第j以k为步长的元素 |
ls += lt | 更新列表ls,将列表lt元素增加到列表ls中 |
ls *= n | 更新列表ls,七元素重复n次 |
函数或方法 | 描述 |
---|---|
ls.append(x) | 在列表ls最后增加一个元素x |
ls.clear() | 删除所有元素 |
ls.copy() | 生成一个新列表,复制ls中所有元素 |
ls.insert(i,x) | 在列表ls的第i位置增加元素x |
ls.pop(i) | 去除并删除第i元素 |
ls.remove(x) | 将列表ls中出现的第一个元素x删除 |
la.reverse() | 反转元素 |
例子:
ls = ["cat", "dog", "tiger", 1024]
ls.append(1234)
print(ls)
ls.insert(3, "human")
print(ls)
ls.reverse()
print(ls)
#输出结果:['cat', 'dog', 'tiger', 1024, 1234]
#输出结果:['cat', 'dog', 'tiger', 'human', 1024, 1234]
#输出结果:[1234, 1024, 'human', 'tiger', 'dog', 'cat']
ls = []
print(ls)
ls += ['cat', 'dog', 'bird', 'human', 1024]
print(ls)
del ls[1:3]
print(ls)
print(0 in ls)
ls.append(0)
print(ls)
print(ls.index(0))
print(len(ls))
ls.clear()
print(ls)
#输出结果:
[]
['cat', 'dog', 'bird', 'human', 1024]
['cat', 10086, 'bird', 'human', 1024]
['cat', 'lhp', 10086, 'bird', 'human', 1024]
['cat', 10086, 'bird', 'human', 1024]
['cat', 'human', 1024]
False
['cat', 'human', 1024, 0]
3
4
[]
for item in ls: #遍历列表
<语句块>
for item in tp: #遍历元祖
<语句块>
将数据转化为元组:lt = tuple(ls)
基本统计值:一组数据的总个数len()、和for…in…、平均值、方差(个数据与平均数差的平方和的平均数)·、中位数(排序,然后技术找中间,偶数找中间2个取平均)、、、
#CalStatisticsV1.py
def getNum():
nums = []
t = True
while t:
num = input("请输入数字(回车退出):")
if num == "":
break
else:
nums.append(eval(num))
return nums
def sum(nums): #计算和
sum=0
for item in nums:
sum += item
return sum
def avg(nums): #计算平均值
return sum(nums)/len(nums)
def dev(nums): #计算方差
devsum = 0
for item in nums:
devsum += pow(item - avg(nums), 2)
return pow(devsum/(len(nums)-1), 0.5)
def median(nums): #计算中位数
nums.sort()
print(nums)
if len(nums)%2 == 0:
med = (nums[len(nums)//2-1] + nums[len(nums)//2])/2
else:
med = nums[len(nums)/2]
return med
def main():
ls = getNum()
print("列表为:{}".format(ls))
print("和为:{}".format(sum(ls)))
print("平均数为:{}".format(avg(ls)))
print("方差为:{}".format(dev(ls)))
print("中位数为:{}".format(median(ls)))
main()
#输入2,8,5,9
#输出:
列表为:[2, 8, 5, 9]
和为:24
平均数为:6.0
方差为:3.1622776601683795
[2, 5, 8, 9]
中位数为:6.5
映射–一种键和值得对应
键值对:键是数据索引的扩展
字典是键值对的集合,键值对之间无序
采用大括号{}和dict{}创建,键值对用冒号:表示
<字典变量> = {<键1>:<值1>,<键2>:<值2>,<键3>:<值3>,...,<键n>:<值n>}
<值> = <字典变量>[<键>]
<字典变量>[<键>] = <值>
de = {} #创建空字典de
type(de) #检查变量类型
函数和方法 | 描述 |
---|---|
del d[k] | 删除字典d中键k对应的数据值 |
k in d | 判断键k是否在字典d中 |
d.keys() | 返回字典d中所有键的信息 |
d.values() | 返回字典d中所有的值信息 |
d.items() | 返回字典d中所有的键值对信息 |
d.get(k, ) | 键k存在,返回值,不存在则返回值 |
d.pop(k, ) | 键k存在,取出值(即会删除),不存在则返回值 |
d.popitem() | 随机从字典d中取出一个键值对,以元组形式返回 |
d.clear() | |
len(d) |
d = {"中国":"北京", "美国":"华盛顿", "法国":"巴黎"}
print("中国" in d)
print(d.keys())
print(d.values())
print(d.get("中国", "北京"))
print(d.get("巴基斯坦", "伊斯兰堡"))
print(d.popitem())
#输出
True
dict_keys(['中国', '美国', '法国'])
dict_values(['北京', '华盛顿', '巴黎'])
jieba是优秀的中文分词第三方库
中文文本需要通过分词来获得单个的词语
jieba是优秀的中文分词第三方库,需安装
jieba库提供三种分词模式,最简单的只需要一个函数
它是利用一个中文词库,确定汉字之间的关联概率,汉字间概率大的组成词组,形成分词结果,除了分词,用户还可以添加自定义的词组
精确模式、全模式、搜索引擎模式
精确模式:把文本精确地切分开,不存在冗余单词,最常用
全模式:把文本中所有可能的词语都扫描出来,有冗余
搜索引擎模式,在精确模式基础上,对长词再次切分
函数 | 描述 |
---|---|
jieba.lcut(s) | 精确模式,返回一个列表类型的分词结果,最常用 |
jieba.lcut(s, cut_all=True) | 全模式,返回一个列表类型的分词结果,存在冗余 |
jieba.lcut_for__search(s) | 搜索引擎模式,有冗余 |
jieba.add_word(w) | 向粉刺字典增加新词w |
import jieba
for item in jieba.cut("中国是一个伟大的国家"):
print(item)
print("\n")
for item in jieba.cut("中国是一个伟大的国家", cut_all=True):
print(item)
print("\n")
for item in jieba.cut_for_search("中华人民共和国是伟大的"):
print(item)
#输出:
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\MiuRui\AppData\Local\Temp\jieba.cache
Loading model cost 0.629 seconds.
Prefix dict has been built successfully.
中国
是
一个
伟大
的
国家
中国
国是
一个
伟大
的
国家
中华
华人
人民
共和
共和国
中华人民共和国
是
伟大
的
#CalHamletV1.py
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)
for i in range(10):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
#输出结果:
the 1137
and 963
to 736
of 668
you 546
i 538
a 527
my 513
hamlet 455
in 435
三国演义:
#CalThreekingdomV1.py
import jieba
txt = open("threekingdoms.txt", 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(15):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
#输出结果:
曹操 1451
孔明 1383
刘备 1252
关羽 784
张飞 358
商议 344
如何 338
主公 331
军士 317
吕布 300
左右 294
军马 293
赵云 278
引兵 276
次日 271
文件式数据的抽象和集合,是存储在辅助存储器上的数据序列,使数据存储的一种形式,文件展现形态:文本文件和二进制文件。
文本文件和二进制文件只是文件的展示方式,本质上所有的文件都是二进制形式存储,形式上,所有文件采用两种方式展示。
如果文件是由单一特定编码组成的,如UTF-8编码,这样的文件叫文本文件,也可以看成一个长字符串。
二进制文件直接由比特0和1组成,没有统一字符编码,一般存在二进制0和1的组织结构,即文件格式,比如.png、.avi视频图片文件等。
#文件存储状态
<变量名> = open(<路径和文件名,同目录可省略路径>,<打开模式,文本或者二进制,读或者写>)
#文件的占用状态,文件操作
a.close()
#文件的存储状态
读文件:
a.read(size)
a.readline(size)
a.readlines(hint)
写文件:
a.write(s)
a.writelines(lines)
a.seek(offset)
文件的打开模式 | 描述 |
---|---|
‘r’ | 只读模式,默认值,如果文件不存在,会报错 |
‘w’ | 覆盖写模式,文件不存在则创建,存在则完全覆盖 |
‘x’ | 创建写模式,不存在则创建,存在报错 |
‘a’ | 追加写模式,不存在则创建,存在则在文件最后追加内容 |
‘b’ | 二进制文件模式 |
‘t’ | 文本文件模式打开,默认值 |
‘+’ | 与r/w/x/a一同使用,在元功能的基础上增加同时读写功能 |
<变量名>.close()
忘记关闭时,会在程序关闭时自动关闭。
操作方法 | 描述 |
---|---|
.read(size=-1) | 读入全部内容,如果给出参数,则读入前size长度,如s = f.read(2) |
.readline(size=-1) | 读入一行,给出长度,可以读出前size长度 |
.readlines(hint=-1) | 读入文件所有行,以每行为元素形成列表,如果给出参数,读入前hint行 |
遍历全文本:方法1##直接遍历全文件,但当文件特别巨大时,如100GB,会耗费很多资源,一次读入,统一处理
fname = input("请输入要打开的文件名称:")
fo = open(frame, "r")
txt = fo.read()
#对全文txt进行处理
fo.close()
遍历全文本:方法2##处理大文件更常用
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()
逐行遍历文件:方法2##逐行读入
fname = input("请输入要打开的文件名称:")
fo = open(fname, "r")
for line in fo:
print(line)
fo.close()
操作方法 | 描述 |
---|---|
.write(s) | 向文件写入一个字符串或字节流 |
.writelines(lines) | 将一个元素全为字符串的列表写入文件 |
.seek(offset) | 改变当前文件操作指针位置,offset含义如下:0-文件开头,1-当前位置,2-文件结尾,f.seek(0)#回到文件开头 |
fo = open("output.txt", "w+")
ls = ["中国", "法国", "美国"]
fo.writelines(ls)
fo.seek(0) #缺失此语句,指针在末尾,无任何输出
for line in fo:
print(line)
fo.close()
根据脚本绘制图形,不是写代码,而是写数据绘制轨迹,数据脚本是自动化最重要的第一步。
-步骤1:定义数据文件格式(接口)
-步骤2:编写程序,根据文件接口解析参数绘制图形
-步骤3:绘制数据文件
非常具有个性色彩:
<向前行进的距离>, <做判断,0左转,1右转>, <转向角度>,
data.txt中数据为:
300,0,144,1,0,0
300,0,144,0,1,0
300,0,144,0,0,1
300,0,144,1,1,0
300,0,108,0,1,0
184,0,72,1,0,1
184,0,72,0,0,0
184,0,72,0,0,0
184,0,72,0,0,0
184,1,72,1,0,1
184,1,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
184,1,720,0,0,0
#AutoTraceDraw.py
import turtle as t
t.title('自动轨迹绘制')
t.setup(800, 600, 200, 100)
t.color("red")
t.pensize(5)
#数据读取
datals = []
f = open("D:\\Code_Data\\PythonPycharm\\testTxt\\Data.txt")
for line in f:
line = line.replace("\n", "")
datals.append(list(map(eval, line.split(",")))) #map将第一个参数施加到第二个参数上
f.close()
#自动绘制
for i 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])
t.done()
通过这个事例,将数据和功能分离,数据驱动的自行运行,是自动化的最基础的内容。
对于不同问题,接口自行设计。
方法1:空格分隔
中国 美国 日本 德国 法国 英国 意大利
-使用一个或者多个空格分隔进行存储,不换行
-缺点:数据中不能存在空格
方法2:逗号分隔,与空格分隔基本一致
方法3:特殊符号分隔
中国 美 国 美国 美国日本 德 国 德国 德国法国$英国
f = open("D:\\Code_Data\\PythonPycharm\\testTxt\\hdahj.txt", encoding="utf-8")
txt = f.read()
txt = txt.split()
print(txt)
f.close()
#输出:
['中国', '美国', '日本', '德国', '法国', '英国', '意大利']
ls = ['中国', '美国', '日本']
f = open(fname, 'w')
f.write(' '.join(ls))
f.close()
二维数据一般使用二维列表形式
CSV存储格式:Comma-Separated Values
国际通用的一二维数据存储格式,一般.csv扩展名,每行一个一维数据,采用逗号分隔,无空行。excel和一般编辑软件都可以读入或另存为csv文件。
如果某个元素缺失,逗号仍要保留,二维数据的表头可以作为数据存储,也可以另行存储。逗号为英文半角逗号,逗号与数据之间无额外空格。
二维数据的存储按行存和按列存均可以,具体由程序决定,一般索引的习惯是先行后列。
fo = open(fname)
ls = []
for line in fo:
line = line.replace("\n", "")
ls.append(line.split(","))
fo.close
ls = [[],[],[]] #二维列表
f = open(fname, 'w')
for item in ls:
f.write(","join(item)+'\n')
f.close()
w = word.WordCloud()
方法 | 描述 |
---|---|
w.generate(txt) | 向WordCloud对象w中加载文本txt,w.generate(“Python and WordCloud”) |
w.to_file(filename) | 将词云输出位图像文件,.png or .jpg。w.to_file(“outfile.png”) |
绘制词云三步骤:
-步骤1:配置对象参数
-步骤2:加载词云
-步骤3:输出词云文件
参数 | 描述 |
---|---|
width | 图片宽度,默认400像素,w = wordcloud.WordCloud(width = 600) |
heigth | 图片高度,默认200像素,w = wordcloud.WordCloud(height = 400) |
min_font_size | 词云中最小字号,w = wordcloud.WordCloud(min_font_size=10) |
max_font_size | 词云中最大字号,w = wordcloud.WordCloud(min_font_size=20) |
font_step | 制定词云中字体字号的步进间隔,默认为1,w = wordcloud.WordCloud(font_step = 2) |
font_path | 制定字体文件的路径,默认为None,w = wordcloud.WordCloud(font_path=“msyh.ttc”) |
max_words | 指定词云显示最大的单次数量,默认200,w = wordcloud.WordCloud(max_words=20) |
stop_words | 指定词云排除词列表,即不显示的单词列表,w = wordcloud.WordCloud(stop_words=(“Python”)) |
mask | 指定词云形状,默认为长方形,需要引用imread()函数。 |
background_color | 指定词云图片的背景颜色,默认为黑色,w = wordcloud.WordCloud(background_color=“color”) |
from scipy.misc import imread #导入imread
mk = imread("pic.png") #使用imread获取pic。png的形状,并赋给mk
w = wordcloud.WordCloud(mask = mk)
基本思路:
-步骤1:读取文件、分词整理
-步骤2:设置并输出词云
-步骤3:观察结果,优化迭代
#chineseWordCloudV1.py
import jieba
import wordcloud
from imageio import imread
route = input("请输入文件路径和文件名(格式如D:\\Code_Data\\1.txt或者D:/Code_Data/1.txt):")
f = open(route, "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
shape = input("请输入词云形状路径和文件名(后缀为.png):")
mk = imread(shape)
c = wordcloud.WordCloud(mask=mk, font_path="msyh.ttc",width=600, height=600, background_color="white")
c.generate(txt)
name = input("请输入词云名称(后缀为.png或者.jpg):")
c.to_file(name)
程序总体框架及步骤
-步骤1:打印程序的介绍性信息式 -printInfo()
-步骤2:获得程序运行参数:proA,proB,n -getInputs()
-步骤3:利用球员A和B的能力值,模拟n局比赛 -simNGames()
-步骤4:输出球员A和B获胜比赛的场次及概率 -printSummary()
import random
def printIntro():
print("这个程序模拟两个选手A和B的某种竞技比赛")
print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
def getInputs():
a = eval(input("请输入运动员a的能力值(0~1):"))
b = eval(input("请输入运动员b的能力值(0~1):"))
n = eval(input("请输入模拟比赛的场次:"))
return a, b, n
def simOneGame(probA, probB):
scoreA, scoreB = 0, 0
serving = "A"
while scoreA<15 and scoreB<15:
if serving == "A":
if random.random()<probA:
scoreA += 1
else:
serving = "B"
else:
if random.random()<probB:
scoreB += 1
else:
serving = "A"
return scoreA, scoreB
def simNGames(n, probA, probB):
winsA = 0
winsB = 0
for i in range(n):
scoreA, scoreB = simOneGame(probA, probB)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA, winsB
def printSummary(winsA, winsB):
n = winsA+winsB
print("共进行了{}场比赛".format(n))
print("选手A获胜{}场比赛,占比为{:0.1%}".format(winsA, winsA/n))
print("选手B获胜{}场比赛,占比为{:0.1%}".format(winsB, winsB/n))
def main():
printIntro()
probA, probB, n = getInputs()
winsA, winsB = simNGames(n, probA, probB)
printSummary(winsA, winsB)
main()
计算思维被认为人类第三种思维特征。前两种分别是逻辑思维和实证思维。
抽象问题的计算过程,利用计算机自动化求解,因此说计算思维是基于计算机的思维方式
从开源运动说起
-1982年,Richard Stallman启动GNU项目,希望做出一个开源操作系统
-1989年,GNU通用许可协议诞生,自由软件时代到来
-1991年,Linus Torvalds发布了Linux内核
-1998年,网景浏览器开源,产生了Mozilla、火狐等浏览器
计算生态以开源项目为组织形式,充分利用了共识原则和社会利他组织人员,在竞争发展、相互依存和迅速更迭中完成信息技术的更新换代,形成了技术的自我演化路径
计算生态没有顶层设计,以功能为单位,具备三个特点:竞争发展,相互依存,迅速发展。
方法1、进度展示:时间长或者步骤多或者产生大量次数循环,需增加进度展示
方法2、异常处理:检查用户输入,读写文件时对结果进行判断,输入输出对运算结果进行判断
其他方法:
-打印输出:特定位置,输出程序运行的过程信息
-日志文件:对程序异常及用户使用进行定期记录
Python全球社区: https://pypi.org/
pypi = Python package index
实例:开发与区块链相关的程序
-第一步:pypi搜索blockchain
-第二步:挑选适合开发目标的第三方库作为基础
-第三步:完成自己需要的功能
-方法1(主要方法):使用pip命令
-方法2:集成安装方法
-方法3:文件安装方法
pip install <第三方库名称>
pip install -U <第三方库名称> #-U表示update,可以更新已安装的第三方库
pip uninstall <第三方库名> #卸载
pip download <第三方库名> #下载,但并不安装
pip show <第三方库名> #列出某个指定第三方库的详细信息
pip search <关键词> #根据关键词在名称和介绍中搜索第三方库
结合特定的安装工具,批量安装库
-某些第三方库pip下载后,需要编译再安装
-如果操作系统没有编译环境,则能下载不能安装
网站:http://www.lfd.uci.edu/~gohlke/pythonlibs/
-步骤1:在UCI页面搜索wordcloud
-步骤2:下载对应版本的文件
-步骤3:使用pip install <文件名>安 装
os库提供通用的、基本的操作系统交互功能
-路径操作:os.path子库,处理文件路径及信息
-进程管理:启动系统中其他程序
-环境参数:获得系统软硬件信息等环境参数
函数 | 描述 |
---|---|
os.path.abspath(path) | 返回path在当前系统中的绝对路径,os.path.abspath(“file.txt”) |
os.path.normpath(path) | 归一化path的表示形式,统一用\分隔路径 |
os.path.relpath(path) | 返回当前程序与文件之间的相对路径(relative path) |
os.path.dirname(path) | 返回path中的目录名称 |
os.path.basename(path) | 返回path中最后的文件名称 |
os.path.join(path,*paths) | 组合path与paths,返回一个路径字符串 |
os.path.exists(path) | 判断path对应文件或者目录是否存在,布尔类型 |
os.path.isfile(path) | 判断path是否为已存在文件,布尔类型 |
os.path.isdir(path) | 判断path所对应是否为已存在目录,布尔类型 |
os.path.getatime(path) | 返回path对应文件或目录上一次的访问时间 |
os.path.getmtime(path) | 返回path对应文件或目录最近一次的修改时间 |
os.path.getctime(path) | 返回path对应文件或目录的创建时间 |
os进程管理可以控制其他程序的进行。
os.system(command)
-执行程序或命令command
-在windows系统中,返回值为cmd调用返回信息
函数 | 描述 |
---|---|
os.chdir(path) | 修改当前程序操作的路径 |
os.getcwd() | 返回程序的当前路径 |
os.getlogin() | 获得当前系统登录用户名称 |
os.urandom(n) | 获得n个字节长度的随机字符串,通常用于加解密运算 |
第三方库安装脚本:
-需求:能否自动批量安装第三方库
#osTest
import os
libs = {"numpy", "matplotlib"}
try:
for lib in libs:
os.system("pip install "+lib)
print("Successful")
except:
print("Failed Somehow")
数据处理方面:Numpy、Pandas、Scipy
数据可视化:Matplotlib、Seaborn、Mayavi
文本处理:PyPDF2、NLTK、python-docx
机器学习:Scikit-learn、TensorFlow、MXNet
-需求:雷达图方式验证霍兰德人格分析
-输入:个职业人群结合兴趣的调研数据
-输出:雷达图
-需求:用python绘制一朵玫瑰花,先给所思所想
-输入:想象力
-输出:玫瑰花