本文转载于简书,链接为:https://www.jianshu.com/p/8b87c6e9798f
因学习需要,转载至CSDN供自己和更多有兴趣的开发者学习查看。
计算机是根据指令操作数据的设备,具备功能性和可编程性两个基本特性。
计算机技术发展阶段:
机器语言:直接使用二进制代码表达指令,可被计算机硬件直接识别和执行。不同计算机结构的机器指令不同。
汇编语言:使用助记符对应机器语言中的指令,可直接操作计算机硬件。不同计算机结构的汇编指令不同。
机器语言和汇编语言都直接操作计算机硬件并基于此设计,统称“低级语言”。
高级语言按执行方式可分为采用编译执行的静态语言和采用解释执行的脚本语言。
Python语言是一个语法简洁、跨平台、可扩展的开源通用脚本语言。
Python 2.x已经是遗产,Python 3.x是这个语言的现在和未来。
print("Hello World")
每个程序都有统一的运算模式:输入数据、处理数据和输出数据。这种朴素的运算模式形成了基本的程序编写方法:IPO(Input,Process,Output)方法。
IPO不仅是程序设计的基本方法,也是描述计算问题的方式。
Python程序包括格式框架、注释、变量、表达式、分支语句、循环语句、函数等语法元素。
Python语言采用严格的“缩进”来表明程序的格式框架,缩进表达了所属关系
在代码编写中缩进可通过Tab键实现,也可用多个空格实现,建议采用4个空格方式书写代码
#这是注释
'''
这是注释
这也是注释
这还是注释
'''
>>> import keyword
>>> ls=keyword.kwlist
>>> ls
>>>len(ls)
33
Python 3 有33个保留字
<变量1>,…,<变量N>=<表达式1>,…,<表达式N>
if<条件1>:
<语句块1>
elif<条件2>:
<语句块2>
…
else:
<语句块N>
while (<条件>) :
<语句块1>
<语句块2>
for i in range(<循环次数>):
<语句块1>
<> = input("提示性文字")
>>>input("请输入:")
x=eval(input("请输入:"))
Python语法允许在表达式内部标记之间增加空格,适当增加空格有助于提高代码可读性。但应注意,不能改变与缩进相关的空格数量、不能再变量名等命名中间增加空格。
面向对象编程是一种基于对象的编程范式。对象是事物的一种抽象,是一个实体,包含属性和方法两部分。属性是对象中的变量,方法是对象能完成的操作。
<库名>.<函数名>(<函数参数>)
import turtle
turtle.fd(100) #控制画笔向当前行进方向前进100
from <库名> import <函数名,函数名,…,函数名>
from <库名> import *,“ * ”是通配符,表示所有函数
<函数名>(<函数参数>)
from turtle import *
fd(100)
tuetle库是一个图形绘制函数图
turtle.setup(width,height,startx,stary)
turtle.setup(0.8,0.8)
(colorstring)参数表示颜色的字符串;(r,g,b)参数表示颜色对应的RGB值
颜色 | 颜色字符串 | GRB | 十六进制 |
---|---|---|---|
黑色 | black | 0,0,0 | #FFFFFF |
白色 | white | 255,255,255 | #000000 |
灰色 | grey | 190,190,190 | #BEBEBE |
进制种类 | 引导符号 | 描述 |
---|---|---|
十进制 | 无 | 默认情况 |
二进制 | 0b或0B | 由字符0和1组成 |
八进制 | 0o或0O | 由字符0到7组成 |
十六进制 | 0x或0X | 由字符0到9、a到f、A到F组成 |
科学计数法使用字母e或E作为幂的符号,以10为基数,含义如下:
<a>e<b>=a*10b^2
使用整数表达浮点数的方法是高精确度运算的基本方法之一。
复数可以看作是二元有序实数对(a,b),表示为a+bj,其中a是实数部分,简称实部,b是虚数部分,简称虚部。
1.23e-4+5.67e+89j
(1.23e-4+5.67e+89j).real
(1.23e-4+5.67e+89j).imag
操作符 | 描述 |
---|---|
x+y | x与y之和 |
x-y | x与y之差 |
x*y | x与y之积 |
x/y | x与y之商 |
x//y | x与y之整数商,即不大于x与y之商的最大整数 |
x%y | x与y之商的余数,也称为模运算 |
-x | x的负值 |
+x | x本身 |
x**y | x的y次幂,即x^y |
x+=y 等价于 x=x+y
函数 | 描述 |
---|---|
abs(x) | x的绝对值 |
divmod(x,y) | (x//y,x%y),输出为二元组形式(也称为元组类型) |
pow(x,y[,z]) | (x**y)%z,[…]表示该参数可省略 |
round(x[,ndigits]) | 对x四舍五入,保留ndigits位小数,round(x)返回四舍五入的整数值 |
max(x1,x2,…,xn) | x1,x2,…,xn的最大值,n没有限定 |
min(x1,x2,…,xn) | x1,x2,…,xn的最小值,n没有限定 |
函数 | 描述 |
---|---|
int(x) | 将x转换为整数,x可以是浮点数或字符串 |
float(x) | 将x转换为浮点数,x可以是整数或字符串 |
complex(re[,im]) | 生成一个复数,实部为re,虚部为im,re可以是整数、浮点数或字符串,im可以是整数或浮点数但不能为字符串 |
操作符 | 描述 |
---|---|
x+y | 连接两个字符串x与y |
x*n或n*x | 复制n次字符串x |
x in s | 如果x是s的子字符串,返回Ture,否则返回False |
str[i] | 索引,返回第i个字符 |
str[N:M] | 切片,返回索引第N到第M个字符 |
函数 | 描述 |
---|---|
len('x') | 返回字符串x的长度,也可返回其他组合数据类型元素个数 |
str('x') | 返回任意类型x所对应的字符串形式 |
chr(x) | 返回Unicode编码x对应的单字符 |
ord('x') | 返回单字符表示的Unicode编码 |
hex(x) | 返回整数x对应十六进制数的小写形式字符串 |
oct(x) | 返回整数x对应八进制数的小写形式字符串 |
方法 | 描述 |
---|---|
str.lower() | 返回字符串str的副本,全部字符小写 |
str.upper() | 返回字符串str的副本,全部字符大写 |
str.islower() | 当str所有字符都是小写时,返回Ture,否则返回False |
str.isprintable() | 当str所有字符都是可打印的,返回Ture,否则返回False |
str.isnumeric() | 当str所有字符都是数字时,返回Ture,否则返回False |
str.isspace() | 当str所有字符都是空格,返回Ture,否则返回Flase |
str.endswith(suffix[,start[,end]]) | str[start:end]以suffix结尾返回Ture,否则返回Flase |
str.srartswith(prefix[,start[,end]]) | str[start:end]以prefix开始返回Ture,否则返回Flase |
str.split(sep=None,maxsplit=-1) | 返回一个列表,由str根据sep被分割的部分构成 |
str.count(sub[,start[,end]] | 返回str[start:end]中sub子串出现的次数 |
str.replace(old,new[,count]) | 返回字符串str的副本,所有old子串被替换为new,如果count给出,则前count次old出现被替换 |
str.center(width[,fillchar]) | 字符串居中函数 |
str.strip([chars]) | 返回字符串str的副本,在其左侧和右侧去掉chars中列出的字符 |
str.zfill(width) | 返回字符串str副本,长度为width。不足部分在其左侧添加0 |
str.format() | 返回字符串str的一种排版格式 |
str.join(iterable) | 返回一个新字符串,由组合数据类型iterable变量的每个元素组成,元素间用str分隔 |
字符串格式化用于解决字符串和变量同时输出时的格式安排
"圆周率{{{1}{2}}}是{0}".format("无理数",3.1415926,"……")
: | <填充> | <对齐> | <宽度> | <,> | <.精度> | <类型> |
---|---|---|---|---|---|---|
引导符号 | 用于填充的单个字符 | <左对齐、>右对齐、^居中对齐 | 槽的设定输出宽度 | 数字的千位分隔符 适用于整数和浮点数 | 浮点数小数部分的精度或字符串的最大输出长度 | 整数类型b,c,d,o,x,X;浮点数类型e,E,f,% |
if语句语法格式:
if <条件>:
<语句块>
形成判断条件最常见的方式是采用关系操作符
关系操作符 | 数学符号 | 操作符含义 |
---|---|---|
< | < | 小于 |
> | > | 大于 |
<= | ≤ | 小于等于 |
>= | ≥ | 大于等于 |
== | = | 等于 |
!= | ≠ | 不等于 |
if-else语句语法格式:
if <条件>:
<语句块1>
else <条件>:
<语句块2>
二分支结构的简洁表达(适合通过判断返回特定值)
<表达式1> if <条件> else <表达式2>
if-elif-else语句语法格式:
if <条件1>:
<语句块1>
elif <条件2>:
<语句块2>
...
else:
<语句块N>
for语句语法格式
for <循环变量> in <遍历结构>:
<语句块>
循环N次:
for i in rang(N):
<语句块>
遍历文件的每一行:
for line in fi:
<语句块>
遍历字符串s
for c in s:
<语句块>
遍历列表ls
for item in ls:
<语句块>
遍历循环的扩展模式
for <循环变量> in <遍历结构>:
<语句块1>
else:
<语句块2>
当for循环正常执行后,程序会继续执行else语句
while语句语法格式
while <条件>:
<语句块>
无限循环的扩展模式
while <条件>:
<语句块1>
else:
<语句块2>
for s in "BIT":
for i in rang(2):
print(s,end="")
if s=="I":
break
for循环和while循环中都有一个else扩展用法。else语句仅在循环正常遍历了所有内容或由于条件不成立而结束循环的条件下执行。
for s in "PYTHON":
if s =="T":
continue
print(s,end="")
else:
print("正常退出")
>>>
PYHON 正常退出
for s in "PYTHON":
if s =="T":
break
print(s,end="")
else:
print("正常退出")
>>>
PY
random库采用梅森旋转算法生成伪随机数序列,可用于除随机性要求更高的加解密算法外的大多数工程应用
函数 | 描述 |
---|---|
seed(a=None) | 初始化随机数种子,默认值为当前系统时间 |
random() | 生成一个[0.0,1.0]之间的随机小数 |
randint(a,b) | 生成一个[a,b]之间的整数 |
getrandbits(k) | 生成一个k比特长度的随机整数 |
randrange(start,stop[,step]) | 生成一个[start,stop]之间以step为步数的随机整数 |
uniform(a,b) | 生成一个[a,b]之间的随机小数 |
choice(seq) | 从序列类型,例如列表中随机返回一个元素 |
shuffle(seq) | 将序列类型中的元素随机排列,返回打乱后的序列 |
sample(pok,k) | 从pop类型中随机选取k个元素,以列表类型返回 |
Python通过try、except等保留字提供异常处理功能
try:
<语句块1>
except <异常类型>:
<语句块2>
try:
<语句块1>
except <异常类型1>:
<语句块2>
...
except <异常类型N>:
<语句块N+1>
except <异常类型N+!>:
<语句块N+2>
try:
<语句块1>:
except <异常类型1>:
<语句块2>
else:
<语句块3>
finally:
<语句块4>
def<函数名>(<参数列表>):
<函数体>
return<返回值列表>
函数调用和执行的一般形式
<函数名>(<参数列表>)
<函数名>=lambda<参数列表>:<表达式>
lambda函数与正常函数一样,等价于下面表达式:
def<函数名>(<参数列表>):
return<表达式>
f=lambda q,w,e,r:q+w+e+r
f(1,2,3,4)
10
函数可定义可选参数,使用参数的位置或名称传递参数值,根据函数中变量的不同作用域有不同的函数返回值方式
dfe r(str,times=2):
print(str*times)
r("T")
TT
r("T")
TTTT
def vfunc(a,*b)
print(type(b)
for n in b:
a+=n
return a
vfunc(1,2,3,4,5)
<class 'tuple'>
15 #1+2=3;3+3=6;6+4=10;10+5=15
def func(a,b):
return b,a
s=func("t",2)
print(s,type(s))
(2, 't') <class 'tuple'>
Python时间处理的标准函数库datetime提供里一批显示日期和时间的格式化方法。
datetime库可以从系统中获得时间,并以用户选择的格式输出
>>>from datetime import datetime
>>>now=datetime.now()
>>>now
datetime.datetime(2018, 5, 13, 16, 49, 38, 627464)
>>>from datetime import datetime
>>>utcnow=datetime.now()
>>>utcnow
datetime.datetime(2018, 5, 13, 8, 53, 59, 788612)
>>>some=datetime(2018,5,13,17,0,0,0)
>>>some
datetime.datetime(2018, 5, 13, 17, 0)
-创建datetime对象后,可利用该对象的属性显示时间
(以上述“some”为例)
属性 | 描述 |
---|---|
some.min | 固定返回datetime的最小时间对象,datetime(1,1,1,0,0) |
some.max | 固定返回datetime的最大时间对象,datetime(9999,12,31,23,59,59,999999) |
some.year | 返回some包含的年份 |
some.month | 返回some包含的月份 |
some.day | 返回some包含的日期 |
some.hour | 返回some包含的小时 |
some.minute | 返回some包含的分钟 |
some.second | 返回some包含的秒钟 |
some.microsecond | 返回some包含的毫秒 |
属性 | 描述 |
---|---|
some.isofomat() | 采用ISO8601标准显示时间 |
some.isoweekday() | 根据日期计算星期 |
some.strftime() | 根据格式化字符串format进行格式显示的方法 |
格式化字符串 | 对象 | 取值范围 |
---|---|---|
%Y | 年 | 0001~9999 |
%m | 月 | 1~12 |
%B | 月名 | January~December |
%b | 月名缩写 | Jan~Dec |
%d | 日期 | 01~31 |
%A | 星期 | Monday~Sunday |
%a | 星期缩写 | Mon~Sum |
%H | 小时(24h制) | 00~23 |
%I | 小时(12h制) | 01~12 |
%p | 上、下午 | AM/PM |
%M | 分钟 | 00~59 |
%S | 秒 | 00~59 |
>>>some=datetime(2018,5,13,17,0,0,0)
>>>some.strftime("%Y年%m月%d日,%H时%M分%S秒")
'2018年05月13日,17时00分00秒'
‘今天是{0:%Y}年{0:%m}月{0:%d}日’.format(some))
今天是2018年05月13日
递归的定义:函数定义中调用函数自身的方式称为递归
n!=n(n-1)(n-2)...(1)
n!=1 (n=0)
n!=n(n-1)! (otherwise)
def fact(n):
if n==0:
return 1
else:
return n*fact(n-1)
num=eval(input('请输入一个整数:'))
print(fact(abs(int(num))))
科赫曲线属于分形几何分支,它的绘制过程体现了递归思想
from turtle import *
def koch(size,n):
if n==0:
fd(size)
else:
for angle in [0,60,-120,60]:
left(angle)
koch(size/3,n-1) # 递归
def main(size,level):
setup(600,600) # 设置主窗体大小
speed(0) # 设置画笔速度,(1~10)
hideturtle() # 隐藏turtle箭头
penup()
goto(-150,50)
pendown()
pensize(1) # 设置画笔尺寸
koch(size,level)
right(120)
koch(size,level)
right(120)
koch(size,level)
main(300,3)
Python提供68个内置函数
组合数据类型为多个类型或不同类型数据提供单一表示,使数据操作更有序、更容易。组合数据类型分为序列类型、集合类型和映射类型3类。
序列类型是一维元素向量,元素间存在先后关系,通过序号访问,元素之间不排他。
>>>X=('a','b','c') #等同 X='a','b','c'
>>>Y=(1,2,3,X)
>>>Y[3][2] #多级索引
'c'
序列类型的通用操作符和函数
操作符或函数 | 描述 |
---|---|
x in s | 如果x是s的元素,返回True,否则返回Flase |
x not in s | 如果x不是s的元素,返回True,否则返回Flase |
s+t | 连接s和t |
s*n或n*s | 将序列s复制n次 |
s[i] | 索引,返回序列s的第i个元素 |
s[i:j] | 分片,返回包含序列s第i到第j(不含)个元素的子序列 |
s[i:j:k]步骤分片,返回包含序列s第i到第j(含)个元素以k为步长的子序列 | |
len(s) | 序列s的元素个数(长度) |
min(s) | 序列s中的最小元素 |
max(s) | 序列s中的最大元素 |
s.index(x[,i[,j]]) | 序列s中从i开始到j位置第一次出现元素x的位置 |
s.count(x) | 序列s中出现x的总次数 |
集合类型是一个元素集合,元素之间无序,相同元素在集合中唯一存在。
哈希运算可以将任意长度的二进制值映射为较短的固定长度的二进制值,哈希值是对数据的一种有损且紧凑的表示形式,是数据在另一个数据维度的体现。
集合类型的操作符(10个)
操作符 | 描述 |
---|---|
S-T | 差集:返回一个集合,包括在集合S中但不在集合T中的元素 |
s-=T | 更新集合S,包括在集合S中但不在集合T中的元素 |
S&T | 交集:返回一个新集合,包括同时在集合S和T中的元素 |
S&=T | 更新集合S,包括同时在集合S和T中的元素 |
S^T | 补集:返回一个新集合,包括集合S和T中的元素,但不包括同时在其中的元素 |
S=^T | 更新集合S,包括集合S和T中的元素,但不包括同时在其中的元素 |
S|T | 并集:返回一个新集合,包括集合S和T中的所有元素 |
S=|T | 更新集合S,包括集合S和T中的所有元素 |
S<=T | 判断S是否是T的真子集 |
S>=T | 判断S是否是T的真超集 |
集合类型的操作函数或方法(10个)
操作函数或方法 | 描述 |
---|---|
S.add.(x) | 如果数据项x不在集合S中,将x增加到S |
S.clear() | 移除S中的所有数据项 |
S.copy | 返回集合S的一个副本 |
S.pop() | 随机返回集合S中的一个元素,若S为空,产生KeyError异常 |
S.discard(x) | 如果x在集合S中,则移除x;若不在也不报错 |
S.remove(x) | 如果x在集合S中,则移除x;否则产生KeyError异常 |
S.isdisjoint(T) | 如果集合S与T没有相同元素,则返回True |
len(S) | 返回集合S的元素个数 |
x in S | 如果x是S的元素,返回True,否则返回False |
x not in S | 如果x不是S的元素,返回True,否则返回False |
映射类型是“键-值”数据项的组合,每个元素是一个键值对,表示为(key,value)。
列表类型特有的函数或方法(14个)
函数或方法 | 描述 |
---|---|
ls[i]=x | 替换列表ls第i个数据为x |
ls[i:j]=lt | 用列表lt替换列表ls中第i到第j(不含)项的数据 |
ls[i:j:k]=lt | 用列表lt替换列表ls中第i到第j(不含)项以k为步数的数据 |
del ls[i:j] | 删除列表ls中第i到第j(不含)项的数据,等价于ls[i:j]=[] |
del ls[i:j:k] | 删除列表ls中第i到第j(不含)项以k为步数的数据 |
ls+=lt或ls.extend(lt) | 将列表lt的元素增加到列表ls中 |
ls*=n | 更新ls列表,使其元素重复n次 |
ls.append(x) | 在列表ls最后增加一个元素x |
ls.clear() | 删除列表ls中的所有元素 |
ls.copy() | 生成一个新列表,复制ls中的所有元素 |
ls.insert(i,x) | 在列表ls的第i个位置增加元素x |
ls.pop(i) | 将列表ls中的元素取出并删除该元素 |
ls.remove(x) | 将列表ls中出现的第一个x元素删除 |
ls.reverse() | 将列表ls中的元素反转 |
from math import *
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 sqrt(sdev/(len(numbers)-1))
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
n=getNum()
m=mean(n)
print(‘平均值:{},方差:{},中位数:{}’.format(m,dev(n,m),median(n)))
字典是包含零个或多个键值对的集合,没有长度限制,可以根据减值索引内容
{<键1>:<值1>,<键2>:<值2>,...<键n>:<值n>}
<值>=<字典变量>[<键>]
字典类型的函数和方法
函数和方法 | 描述 |
---|---|
返回所有的键信息 | |
返回所有的值信息 | |
返回所有的键值对 | |
键存在则返回相应值,否则返回默认值 | |
键存在则返回相应值,同时删除键值对,否则返回默认值 | |
随机从字典中取出一个键值对,以元组(key,value)形式返回 | |
删除所有的键值对 | |
del |
删除字典中某一个键值对 |
如果键在字典中则返回Ture,否则返回False |
jieba库主要提供分词功能,可以辅助自定义分词词典
jieba库常用的分词函数
|函数|描述|
|---|---|
|jieba.cut(s)|精确模式,返回一个可迭代的数据类型|
|jieba.cut(s,cut_all=Ture)|全模式,输出文本s中所有可能的单词|
|jieba.cut_for_search(s)|搜索引擎模式,适合搜索引擎建立索引的分词结果|
|jieba.lcut(s)|精确模式,返回一个列表类型,建议使用|
|jieba.lcut(s,cut_all_=Ture)|全模式,返回一个列表类型,建议使用|
|jieba.lcut_for_search(s)|搜索引擎模式,返回一个列表类型,建议使用|
|jieba.add_word(w)|向分词词典中增加新词w|
jieba.lcut()函数返回精确模式,输出的分词能够完整且不多余地组成原始文本
jieba.lcut(,True)函数返回全模式,输出原始文本中可能产生的所有问题,冗余性最大
jieba.lcut_for_search()函数返回搜索引擎模式,该模式首先执行精确模式,然后再对其中的长词进一步分切得出结果
无识别的分词,可通过jieba.add_word()函数向分词库中添加
词频统计只是累加问题,即对文档中每个词设计一个计数器,词语每出现一次,相关计数器加1.。如果以词语为键,计数器为值,构成<单词>:<出现次数>的键值对,采用字典数据结构统计词语出现的频次,将很好第解决问题
excludes={'the','and','to','of','you','a','i','my','in','it','that','is','not','his','this','but','with'}#排除词汇库集合
def getText():
txt = open("D:\\python\\fenci\\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
for word in excludes:
del(counts[word])
items=list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)
print(items)
for i in range(20):
word,count=items[i]
print('{0:<10}{1:>5}'.format(word,count))
中文文章需要分词才能进行词频统计,需要用到jieba库。
import jieba
excludes={"将军","却说","荆州","二人","不可","不能","如此","商议","如何","主公",\
"军士","左右","军马","引兵","次日","大喜","天下","于是","东吴","今日",\
"不敢","魏兵","陛下","人马","不知","都督","一人","汉中"}\
#与人名无关的词汇库集合
txt=open("D:\\python\\fenci\\三国演义.txt","r",encoding='utf-8').read()
words=jieba.lcut(txt)#jieba库分词
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="曹操"
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))
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
s = """Gur Mra bs Clguba, ol Gvz Crgref
Ornhgvshy vf orggre guna htyl.
Rkcyvpvg vf orggre guna vzcyvpvg.
Fvzcyr vf orggre guna pbzcyrk.
Pbzcyrk vf orggre guna pbzcygrq.
Syng vf orggre guna arfgrq.
Fcnefr vf orggre guna qrafr.
Ernqnovyvgl pbhagf.
Fcrpvny pnfrf nera’g fcrpvny rabhtu gb oernx gur ehyrf.
Nygubhtu cenpgyvgl orngf chevgl.
Reebef fubhyq arire cnff fvyragyl.
Hayrff rkcyvpvgyl fvyraprq.
Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.
Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.
Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh’er Qhgpu.
Abj vf orggre guna arire.
Nygubhtu arire vf bsgra orggre guna evtug abj.
Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg’f n onq vqrn.
Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.
Anzrfcnprf ner bar ubaxvat terng vqrn – yrg’f qb zber bs gubfr!"""
d = {}
for c in (65, 97):#chr(65)chr(97)为az、A~Z
for i in range(26):
d[chr(i+c)] = chr((i+13) % 26 + c)#将循环编号增加了13,直接好处是原文和密文之间的相互转换可以使用同一个程序
print("".join([d.get(c, c) for c in s]))
Python能够以文本和二进制两种方式处理
<变量名>=open(<文件名>,<打开模式>)
文件的打开模式
文件的打开模式 | 含义 |
---|---|
‘r’ | 只读模式,如果文件不存在,返回异常FileNotFoundError,默认值 |
‘w’ | 覆盖写模式,文件不存在则创建,存在则完全覆盖 |
‘x’ | 创建写模式,文件不存在则创建,存在则返回异常FileExistsError |
‘a’ | 追加写模式,文件不存在则创建,存在则在文件最后追加内容 |
‘b’ | 二进制文件模式 |
‘t’ | 文本文件模式,默认值 |
‘+’ | 与r/w/x/a一同使用,在原功能基础上增加同时读写功能 |
<变量名>.close()
文件内容读取方法
操作方法 | 含义 |
---|---|
读入整个文件内容,返回一个字符串或字节流 | |
从文件中读入整个文件内容,如果给出参数,读入前size长度的字符串或字节流 | |
从文件中读入一行内容,如果给出参数,读入该行前size长度的字符串或字节流 | |
从文件中读入所有行,以没行为元素形成一个列表,如果给出参数,读入hint行 |
备注:返回字符串或字节流取决于文件打开模式
#逐行读入内容到内存有利于优化程序执行速度
fname=input('请输入要打开的文本文件')
fo=open(fname,'r')
for line in fo:#处理一行数据
print(line)
fo.close
文件内容写入方法
方法 | 含义 |
---|---|
向文件写入一个字符串或字节流 | |
将一个元素全为字符串的列表写入文件 | |
改变当前文件操作指针的位置,offset的值:0——文件开头;1——当前位置;2——文件结尾 |
对于数据处理,需要考虑存储格式以及表示和读写两个问题
CSV格式应用基本规则
1.csv :
列1,列2,列3,列4,列5
1,1,1,1,1
2,2,2,2,2
3,3,3,3,3
4,4,4,4,4
5,5,5,5,5
导入CSV格式数据到列表
fo=open('1.csv','r')
ls=[]
for line in fo:
line=line.replace('\n','')
ls.append(line.split(',')) # 以split(',')方法从CSV文件中获得内容时,每行最后一个元素后面包含了一个换行符('\n'),应去掉。
print(ls)
fo.close()
>>>
[ ['列1', '列2', '列3', '列4', '列5'], ['1', '1', '1', '1', '1'], ['2', '2', '2', '2', '2'], ['3', '3', '3', '3', '3'], ['4', '4', '4', '4', '4'], ['5', '5', '5', '5', '5'] ]
逐行处理CSV格式数据
fo=open('1.csv','r')
ls=[]
for line in fo:
line=line.replace('\n','')
ls=line.split(',')
ins=''
for s in ls:
ins+='{}\t'.format(s)
print(ins)
fo.close()
>>>
列1 列2 列3 列4 列5
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
一维数据写入CSV文件
fo=open('1.csv','a')
ls=['6','6','6','6','6']
fo.write(','.join(ls)+'\n')
fo.close()
二维数据写入CSV文件
fr=open('1.csv','r',encoding='UTF-8')
fw=open('2.csv','w',encoding='UTF-8')
ls=[]
for line in fr: #将CSV文件中的二维数据读入到列表变量
line=line.replace('\n','')
ls.append(line.split(','))
for i in range(len(ls)): #遍历列表变量
if i==0: #跳过第一行列名
continue
for j in range(len(ls[i])):
ls[i][j]=str(int(ls[i][j])*2)
for row in ls: #将列表变量输出到CSV文件
print(row)
fw.write(','.join(row)+'\n')
fr.close()
fw.close()
'''注意事项
1.UnicodeDecodeError: 'gbk' codec can't decode byte...在open()最后添加“encoding='UTF-8'”
2.line.replace('\n',''),换行符是“\n”而不是“n”——注意不要打错符号
3.ls.append(line.split(',')),split(',')而不是split('')——注意不要打错符号
4.ls[i][j]=str(int(ls[i][j])*2),注意列表中嵌套列表情况下的索引;注意“ls[i][j]”类型为str
5.",".join(row)生成一个新的字符串,它由字符串“,”分隔列表row中的元素形成
6.fr.close(),注意close()方法后要有括号“()”
'''
HTML(HyperText Markup Language)超文本标记语言,本质上是键值对的标记,它采用
value 的方式表达键key对应的值value。
将CSV文件转换成HTML文件分3步骤:
键值对是高维数据的特征
JSON格式表达键值对的基本格式:"key":"value"
多个键值对放在一起的规则
函数 | 描述 |
---|---|
json.dumps(obj,sort_keys=Flase,indent=None) | 将Python的数据类型转换为JSON格式,编码过程 |
json.loads(string) | 将JSON格式字符串转换为Python的数据类型,解码过程 |
json.dump(obj,fp,sort_keys=Flase,indent=None) | 与dumps()功能一致,输出到文件fp |
json.load(fp) | 与loads()功能一致,从文件fp读入 |
将CSV格式转换成JSON格式
import json
fr=open('1.csv','r',encoding='UTF-8')
ls=[]
for line in fr:
line=line.replace('\n','')
ls.append(line.split(','))
fr.close()
fw=open('1.json','w')
for i in range(1,len(ls)):
ls[i]=dict(zip(ls[0],ls[i])) #zip()将两个长度相同的列表组合成一个关系对
json.dump(ls[1:],fw,sort_keys=True,indent=4,ensure_ascii=False)
fw.close()
'''
ls[1:] 表示列表第2项到最后一项
ensure_ascii=False 使json库输出中文呢字符
'''
将JSON格式转换成CSV格式
import json
fr=open('1.json','r')
ls=json.load(fr)
data=[list(ls[0].keys())] #ls[0].keys()返回所有的键信息
for item in ls:
data.append(list(item.values())) #item.values()返回所有的值信息
fr.close()
fw=open('1-1.csv','w')
for item in data:
fw.write(','.join(item)+'\n')
fw.close()