二级备赛系列博文
一、小知识什锦
- format相关的知识点
- format的小细节:前面的格式控制符中一定要加引号!
- 注意format是先填充、对齐然后宽度,顺序不能乱的!
- format带千分位分隔的效果,
n = input() print("{:->20,}".format(eval(n)))
a = "python"
b = "="
c = ">"
print("{0:{1}{3}{2}}".format(a, b, 25, c)) #就相当于print("{0:=>25}".format(a))
- 列表
[]
ls = [3.5, "Python", [10, "LIST"], 3.6]
然后print(ls[2][ –1][1])
的运行结果是L
想成三维数组的索引
-
字典
{}
- 对字典中元素统计的语句:
d[word] = d.get(word, 0) + 1
- d.items()返回字典中的所有键值对信息,返回结果是Python的一种内部数据类型dict_items。
- 对字典中元素统计的语句:
-
字符串
str.replace(old, new)
返回字符串str的副本,所有old子串被替换为new- str.strip(chars)从字符串str中去掉在其左侧和右侧chars中列出的字符。chars是一个字符串,其中出现的每个字符都会被去掉。
-
turtle相关
- turtle库的fd函数绘制直线,seth函数用来设置对应于角度坐标系的绝对值方向(正值为逆时针);left函数用来在当前行进方向上向左转向。
- 注意turtle开始就是自西向东的,向左还是向右是根据海龟目前的朝向而言的
turtle.circle (radius, extent=None)
根据radius绘制extent角度的弧形
-
random相关
- randint是生成一个[a,b]之间的整数,注意区间都是闭的。
-
time相关
time.strftime('%Y-%m-%d %H:%M:%S', startTime)
和time.strptime(timeString, "%Y-%m-%d %H:%M:%S")
是一个刚好相反的过程,记住strftime是生成一个标准的格式即可
-
pyinstaller相关
- 使用-i参数增加对打包文件图标的引入,使用-F参数用来生成单一的打包后可执行文件程序
pyinstaller -i a.ico -F a.py
-
jieba相关
- jieba库的分词原理是利用一个中文词库,将待分词的内容与分词词库的内容进行对比,通过图结构和动态规划算法找到最大概率的词组
-
其他
print( 0.1 + 0.2 == 0.3)
的输出是False,原因是浮点数间的计算存在不确定尾数,不是bug。因为print(0.1 + 0.2)
输出0.30000000000000004
…
二、通用代码
- 统计字符串中的某字符个数
m = s.count(',') + s.count('?') #其中的标点符号个数
n = len(s) - m #其中的汉字个数
- 统计N~N+100的所有奇数和
N = input("请输入一个整数: ")
sum = 0
for i in range(eval(N), eval(N)+100): #注意是eval(N)+100
if (i % 2) != 0:
sum += i
print(sum)
- 统计列表中元素出现次数
ls = [...]
for word in ls:
d[word] = d.get(word, 0) + 1
for j in d:
print("{}:{}".format(j, d[j]))
- 输入整数
def getInput():
try:
txt = input("")
if eval(txt) != int(txt):
print("")
except:
return getInput()
return eval(txt)
print(getInput())
- 输入字符串,宽度15,居中,不足15填充=,超过15只要前15个
- [分析] 主要考察format的,①、关于=^前后位置,必须是是先填充然后居中②、当大于指定宽度的时候,format是全部输出的,所以我们手动截取前15个元素
s = input()
print("{:=^15}".format(s[0:15]))
- 绘制三角形
- [亮点]使用*,而不是+
import turtle as t
for i in range(3):
t.seth(i*120)
t.fd(200)
- 四片花瓣的绘制
import turtle as t
for i in range(4):
t.seth(90 * (i + 1))
#90,180,270,360
t.circle(200,90)
#-90,0,90,180
t.seth(-90 + i * 90)
t.circle(200,90)
- 字典一个应用
- 【亮点】注意添加、删除和添加的方法
d = {'数学':101, '语文':202, '英语':'203', '物理':204, '生物':206}
d['化学'] = 205
d['数学'] = 201
del d['生物']
for key in d:
print("{}:{}".format(d[key], key))
- 累加键盘输入且用逗号分隔的若干数字
- 字符串split方法的使用,最后产生的是一个列表
- eval将字符串变成表达式
n = input("")
nums = n.split(",")
s = 0
for i in nums:
s += eval(i)
print(s)
- 求最大公约数
- 首先调置a和b的顺序,使得a > b,r的初值置为1
- 当r!=0是就辗转相除
- r = a % b
- a = b
- b = r;
def GreatCommonDivisor(a,b):
if a > b:
a,b = b,a
r = 1
while r != 0:
r = a % b
a = b
b = r
return a
m = eval(input())
n = eval(input())
print(GreatCommonDivisor(m, n))
- 去除一个列表中的全部素数
- 所谓素数是除1和它本身,无其他公因子的数…
def is_prime(n):
for i in range(2, n):
if n % i == 0:
return False
return True#此处可为多行函数定义代码
ls = [23,45,78,87,11,67,89,13,243,56,67,311,431,111,141]
for i in ls.copy():
if is_prime(i)== True:
ls.remove(i) #此处为一行代码
print(len(ls))
易错的…
1、
x=10
y=3
print(divmod(x,y))
输出
(3,1) #注意是带括号的
2、
a = 10.99
print(complex(a))
输出
(10.99+0j) #注意:是带括号的
3、
s = "Alice"
print(s[::–1])
输出
ecilA
4、
注意: Python中字符串切片方法 字符串[开始索引:结束索引:步长]
5、
for i in range(6):
print(chr(ord(9801)+i),end="")
系统输出会报错
6、
for i in range(12):
print(chr(ord("♈")+i),end="")
输出:
♈♉♊♋♌♍♎♏♐♑♒♓
7、
s1 = "The python language is a scripting language."
s1.replace('scripting','general')
print(s1)
输出是
The python language is a scripting language.
8、
但是这个程序:
s1 = "The python language is a scripting language."
s2 = s1.replace('scripting','general')
print(s2)
输出是:
The python language is a general language.
9、
s = "The python language is a cross platform language."
print(s.find('language',30))
改程序的功能是输出language
的出现的最小序号,从下标为30开始找,所以输出是:
40
10、
chr(13).isprintable() #输出False,13对应的ascii是转义字符,转义字符不可打印
11、
isinstance(255,int)
#Python 中的isinstance函数,isinstance是Python中的一个内建函数。是用来判断一个对象的变量类型。
#所以255是整型,输出True
12、
a = "alex"
b = a.capitalize()
print(a,end=",")
print(b)
#Python capitalize()将字符串的第一个字母变成大写,其他字母变小写。对于 8 位字节编码需要根据本地环境。
#所以输出alex,Alex
13、
14、
15、
16、
注意小数是无穷。
17、
18、
19、
20、
21、
22、
具体是什么啥类型是根据输入参数决定的。
23、
基本类型的局部变量是不能被改变全局变量的
24、
注意C选项输出是列表,列表输出需要加 [ ]
参数调用的几种类型:
按位置参数调用
按可变参数调用
参数按照名称传递
25、
for循环另一种新奇用法:
for 循环还可以这样用
l = [x for x in range(0, 10)]
26、
注意最后必须进行一次list转换!
27、
28、
29、
列表倒序输出的一个小技巧 [::-1]
这个除了要注意倒序输出,还要注意输入元组,输出也是元组(使用小括号)
30、不能生成空字典的是:
31、
32、
33、
34、
35、
36、
字典中的键不能重复
37、
zip也不失为一种创建字典的好方法
38、
当文件以文本文件方式打开时,读写按照字符串方式
当文件以二进制文件方式打开时,读写按照字节流方式
39
40、
41、
是有默认值的
42、
43、
44、
45、
join之后的列表就变成了一个字符串
46、
47、
48、
列表可以是1/2/多维,字典是高维的
49、
50、
51、
三、实例
实例1、《论语文本处理》
fi = open("论语-网络版.txt", "r", encoding = "utf-8")#注意encoding是不在引号里面的
fo = open("论文-clay.txt",'w')
wflag = False
for line in fi:
if "【" in line:
wflag = False
if "【原文】" in line:
wflag = True
continue
if wflag == True:
for i in range(0,25):
for j in range(0, 25):
line = line.replace("{}·{}".format(i, j), "**")
for i in range(0,10):
line = line.replace("*{}".format(i), "");
for j in range(0,10):
line = line.replace("{}*".format(j), "")#注意是format(j)
line = line.replace("*", "")
fo.write(line)
fi.close()
fo.close()
fi = open("论文-clay.txt", "r")
fo = open("论文-clay-去注释.txt", "w")
for line in fi:
for i in range(1, 23):
line = line.replace("({})".format(i), "")
fo.write(line)
fi.close()
fo.close()
实例2、天龙八部中的统计
- 对其中的汉字和标点统计(不包括空格和换行)
fi = open("天龙八部-网络版.txt", "r", encoding = "utf-8")
fo = open("统计.txt", "w", encoding='utf-8')#为什么这里必须加 encoding='utf-8'呢?
txt = fi.read()
d = {}
for c in txt:
d[c] = d.get(c, 0) + 1
del d[' ']
del d['\n']
ls = []
for key in d:
ls.append("{}:{}".format(key, d[key]))
fo.write(",".join(ls))
fi.close()
fo.close()
- 对其中的中文词语进行统计
大体类似上一个,不过加入了jieba进行切分
import jieba
fi = open("天龙八部-网络版.txt", "r", encoding = "utf-8")
fo = open("统计分词.txt", "w", encoding='utf-8')
txt = fi.read()
words = jieba.lcut(txt)
d = {}
for w in words:
d[w] = d.get(w, 0) + 1
del d[' ']
del d['\n']
ls = []
for key in d:
ls.append("{}:{}".format(key, d[key]))
fo.write(",".join(ls))
fi.close()
fo.close()
实例3、生成随机密码
import random
random.seed(0x1010)
s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*"
ls = []
excludes = ""
while len(ls) < 10:
pwd = ""
for i in range(10):
pwd += s[random.randint(0, len(s)-1)]
if pwd[0] in excludes:#密码的首字符是不一样的
continue
else:
ls.append(pwd)
excludes += pwd[0]
print("\n".join(ls))
fo = open("随机密码.txt", "w")
fo.write("\n".join(ls))
fo.close()
实例4、词频统计
- 列出位于前100个的词语
names = ["命运", "寻梦"]
for name in names:
fi = open(name+"-网络版.txt", "r", encoding="utf-8")
fo = open(name+"-字符统计.txt", "w", encoding="utf-8")
txt = fi.read()
d = {}
for c in txt:
d[c] = d.get(c, 0) + 1
del d['\n']
ls = list(d.items())
ls.sort(key=lambda x:x[1], reverse=True)
for i in range(100):
ls[i] = "{}:{}".format(ls[i][0], ls[i][1])
fo.write(",".join(ls[:100]))
fi.close()
fo.close()
- 在上一个词频统计基础上,再统计两个文件中相同字符
def getList(name):
f = open(name+"-字符统计.txt", "r", encoding="utf-8")
words = f.read().split(',')
for i in range(len(words)):
words[i] = words[i].split(':')[0]
f.close()
return words
def main():
fo = open("相同字符.txt", "w")
ls1 = getList("命运")
ls2 = getList("寻梦")
ls3 = []
for c in ls1:
if c in ls2:
ls3.append(c)
fo.write(",".join(ls3))
fo.close()
main()
实例5、星座输出
- 循环读取星座,并输出对应的日期范围以及字符对应形式
#读入CSV格式数据到列表中
fo = open("SunSign.csv","r", encoding='utf-8')
ls = []
for line in fo:
line = line.replace("\n","")
ls.append(line.split(","))
fo.close()
while True:
InputStr = input() # 请输入星座名称,例如双子座
InputStr.strip()
flag = False
if InputStr == 'exit':
break
for line in ls:
if InputStr == line[0]:
print("{}座的生日位于{}-{}之间。".format(chr(eval(line[3])),line[1],line[2]))
flag = True
if flag == False:
print("输入星座名称有误!")