1、阶乘
(1).迭代法
def cheng(x):
result = 1
for i in range(1,x+1):
result = result * i
return result
num = int(input("输入一个数字:"))
print(num,"的阶乘是:",cheng(num))
(2).递归法
def cheng(x):
if x == 1:
return 1
else:
return x * cheng(x-1)
num = int(input("输入一个数字:"))
print(num,"的阶乘是:",cheng(num))
2、汉诺塔
def hannoi(n,x,y,z):
if n == 1:
print(x,'-->',z)
else:
hannoi(n-1,x,z,y)
print(x,'-->',z)
hannoi(n-1,y,x,z)
num = int(input('please enter a number:'))
hannoi(num,'X','Y','Z')
3、文件操作:
题目:
1. 小甲鱼的对话单独保存为boy_*.txt的文件(去掉“小甲鱼:”)
2. 小客服的对话单独保存为girl_*.txt的文件(去掉“小客服:”)
3. 文件中总共有三段对话,分别保存为boy_1.txt, girl_1.txt,boy_2.txt, girl_2.txt, boy_3.txt, gril_3.txt共6个文件(提示:文件中不同的对话间已经使用“=================”分割)
文件内容:
小甲鱼:aaaaaaaaaaaaaaaaaaaaaaaa
小客服:bbbbbbbbbbbbbbbbbbbbbbbbbbb
小甲鱼:ccccccccccccccccccccccccc
小客服:dddddddddddddddddddddddddddd
================
小甲鱼:11111111111111111111
小客服:222222222222222222222222222
小甲鱼:333333333333333333333333
小客服:4444444444444444444444
================
小甲鱼://////////////////////////
小客服:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
小甲鱼:..........................
小客服:,,,,,,,,,,,,,,,,,,,,,,,,,,,
代码:
f = open("D:\\...\\111.txt") #打开文件
#1、设置中间变量
boy = []
girl = []
num = 1
#2、循环文件内容,遇到特定条件后进行保存
for i in f: #!循环文件的使用方式
if i[:3] == '小甲鱼':
boy.append(i.split(':')[1]) #把符合条件的内容放到列表
if i[:3] == '小客服':
girl.append(i.split(':')[1])
if i[:3] == '===':
boy_file = "boy_" + str(num) + ".txt" #对要保存的文件名进行命名
girl_file = "girl_" + str(num) + ".txt"
b = open(boy_file,"w") #以‘写入’方式打开文件
b.writelines(boy) #!是用writelines,不是write
b.close() #!写入后一定要保存
print("boy_file saved")
g = open(girl_file,"w")
g.writelines(girl)
g.close()
print("girl_file saved")
boy = []
girl = []
num += 1
#3、对最后一段文字需要单独处理
boy_file = "boy_" + str(num) + ".txt" #num在前面循环结束前已经+1
girl_file = "girl_" + str(num) + ".txt"
b = open(boy_file,"w")
b.writelines(boy)
b.close()
print("last boy_file saved")
g = open(girl_file,"w")
g.writelines(girl)
g.close()
print("last girl_file saved")
print('byebye!')
4、编写一个程序,求 100~999 之间的所有水仙花数。
如果一个 3 位数等于其各位数字的立方和,则称这个数为水仙花数。例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一个水仙花数
for i in range(100, 1000):
sum = 0
temp = i
while temp:
sum = sum + (temp%10) ** 3 #主程序
temp //= 10 # 注意这里要使用地板除哦~
if sum == i:
print(i)
结果:
153
370
371
407
5、三色球问题
有红、黄、蓝三种颜色的求,其中红球 3 个,黄球 3 个,绿球 6 个。先将这 12 个球混合放在一个盒子中,从中任意摸出 8 个球,编程计算摸出球的各种颜色搭配。
print('red\tyellow\tblue') #结果展示方法
for red in range(0, 4):
for yellow in range(0, 4):
for green in range(2, 7):
if red + yellow + green == 8:
# 注意,下边不是字符串拼接,因此不用“+”哦~
print(red, '\t', yellow, '\t', green) #结果展示方法
结果:
red yellow blue
0 2 6
0 3 5
1 1 6
1 2 5
1 3 4
2 0 6
2 1 5
2 2 4
2 3 3
3 0 5
3 1 4
3 2 3
3 3 2
6、判断字母、空格、数字
7、编写一个函数,判断传入字符串参数是否为"回文联"(倒读 = 顺读)
我的方法:
def Hui(x):
for i in range(len(x)):
if x[i] == x[(len(x)-1)-i]:
continue
else:
return 'not huiwenlian'
return 'huiwenlian111'
str1 =input('give a string:')
print(Hui(str1))
答案:
def Hui(string):
list1 = list(string)
list2 = reversed(list1) #用函数将列表倒装
if list1 == list(list2):
return 'HuiWen'
else:
return 'NotHuiWen'
print(Hui('上海自来水来自海上'))
8、递归法拆分数字
9、利用字典创建通讯录程序
以下为代码
print('''
|--- 欢迎进入通讯录程序 ---|
|--- 1:查询联系人资料 ---|
|--- 2:插入新的联系人 ---|
|--- 3:删除已有联系人 ---|
|--- 4:退出通讯录程序 ---|
''')
txl = {}
def one():
name = input('请输入联系人姓名:')
if name in txl:
print(name,':',txl.get(name))
give_code()
else:
print('查无此人')
give_code()
def two():
name = input('请输入联系人姓名:')
if name in txl:
print('输入的姓名在通讯录中已存在 --->> ',name,':',txl.get(name))
change = input('是否修改用户资料(YES/NO):')
if change == 'YES':
number = input('请输入用户联系电话:')
txl[name] = number
print('修改成功!')
give_code()
else:
give_code()
else:
number = input('请输入用户联系电话:')
txl[name] = number
print('插入成功!')
give_code()
def three():
name = input('请输入联系人姓名:')
if name in txl:
print('确认删除这条记录吗? --->> ',name,':',txl.get(name))
change = input('确认(YES/NO):')
if change == 'YES':
del txl[name]
print('删除成功!')
give_code()
else:
print('取消删除!')
give_code()
else:
print('查无此人')
give_code()
def four():
print('|--- 感谢使用通讯录程序 ---|')
def give_code():
code = input('请输入相关的指令代码:')
if code == '1':
one()
elif code == '2':
two()
elif code == '3':
three()
elif code == '4':
four()
else:
print('指令输入错误!!!')
give_code()
10、打印指定文件夹下的所有文件类型数量
#本题考察os模块的使用
import os
#初始化文件夹数量
dir_num = 0
#初始化字典,用来存放文件扩展名
zi = {}
#os.walk函数可以遍历文件夹内的所有文件夹和文件,并以列表输出
for root, dirs, files in os.walk(r'D:\小鸡理财\百度云同步盘\小鸡理财\每日数据'):
dir_num += len(dirs) #文件夹列表长度就是文件夹数量
for i in files:
k = os.path.splitext(i)[1] #分离文件名和扩展名
if k in zi: #判断字典内是否存在了该扩展名
zi[k] += 1
else:
zi[k] = 1
#循环打印
for key,value in zi.items():
print('该文件夹下共有类型为【%s】的文件 %s 个' % (key,value))
print('该文件夹下共有类型为【文件夹】的文件 %s 个' % (dir_num))
11、计算当前文件夹下所有文件的大小
import os
for root,dirs,files in os.walk(r'D:\小鸡理财\百度云同步盘\小鸡理财\每日数据'):
os.chdir(root) #如果一个文件夹下有多个子文件夹,需要该函数改变目录
for i in files:
size = os.path.getsize(i) #获得文件大小
print('%s [ %s Bytes]' %(i,size)) #打印
12、查找目录下的指定视频文件格式
import os
file_add = input('请输入待查找的初始目录:')
#设置需要查找的视频文件格式
video = ['.mp4','.rmve','.avi']
video_list = []
#遍历目录下所有文件名,符合条件的写入列表
for root,dirs,files in os.walk(file_add):
for i in files:
k = os.path.splitext(i)[1]
if k in video:
add = root + '\\' + i
video_list.append(add)
#把结果写入txt文件
f = open('video_list.txt','w')
for j in video_list:
f.write(j)
f.write('\n')
f.close()
13、异常处理的另类用法
'''答案'''
try:
for i in range(3):
for j in range(3):
if i == 2:
raise KeyboardInterrupt #激活异常
print(i,j)
except KeyboardInterrupt:
print('out!')
print('6')
14、类和对象的使用案例
import random as r
legal_x = [0,10]
legal_y = [0,10]
class Turtle_or_Fish:
def __init__(self,turtle = False,fish = False):
# 初始体力
self.power = 100
self.turtle = turtle
self.fish = fish
#初始位置
self.x = r.randint(legal_x[0],legal_x[1])
self.y = r.randint(legal_y[0],legal_y[1])
def move(self):
if self.turtle:
#随机计算方向并移动到新的位置(x,y)
new_x = self.x + r.choice([1,-1,2,-2])
new_y = self.y + r.choice([1,-1,2,-2])
else:
#随机计算方向并移动到新的位置(x,y)
new_x = self.x + r.choice([1,-1])
new_y = self.y + r.choice([1,-1])
#检查移动后是否超出场景x轴边界
if new_x < legal_x[0]:
self.x = legal_x[0] - (new_x - legal_x[0])
elif new_x > legal_x[1]:
self.x = legal_x[1] - (new_x - legal_x[1])
else:
self.x = new_x
#检查移动后是否超出场景y轴边界
if new_y < legal_y[0]:
self.y = legal_y[0] - (new_y - legal_y[0])
elif new_y > legal_y[1]:
self.y = legal_y[1] - (new_y - legal_y[1])
else:
self.y = new_y
#体力消耗
self.power -= 1
#返回移动后的新位置
return (self.x,self.y)
def eat(self):
self.power += 20
if self.power > 100:
self.power = 100
turtle = Turtle_or_Fish(turtle = True)
fish = []
count = 1
for i in range(10):
new_fish = Turtle_or_Fish(fish = True)
fish.append(new_fish)
while True:
# print(len(fish))
if not len(fish):
print('鱼儿都吃完了,游戏结束')
break
if not turtle.power:
print('乌龟体力耗尽,挂掉了!')
break
pos = turtle.move()
#在迭代器中删除列表元素是非常危险的,经常会出现意想不到的问题,因为迭代器是直接引用列表的数据进行引用
#这里我们把列表拷贝给迭代器,然后对原列表进行删除操作就不会有问题了^_^
for each_fish in fish[:]:
if each_fish.move() == pos:
#鱼儿被吃掉了
turtle.eat()
fish.remove(each_fish)
print('第 %s 条鱼儿被吃掉了...' %count)
count += 1
15、批量重命名文件
import os
#切换工作目录
os.chdir('D:\VDownload\新建文件夹\我的解析任务1804241345\合并')
#迭代文件夹和文件名
for root,dirs,files in os.walk('D:\VDownload\新建文件夹\我的解析任务1804241345\合并'):
#取文件名,处理
for i in files:
l = i.split(' ',1)[1].strip()
print(l)
#重命名文件
os.rename(i,l)
16、类继承案例
import math
#定义点(x,y)
class Point():
def __init__(self,x = 0,y = 0):
self.x = x
self.y = y
#!返回必须使用定义的函数,不能在__init__内返回
def getX(self):
return self.x
def getY(self):
return self.y
#定义线段
class Line(Point):
#Line类 继承了 Point类,注意传入的是实例
def __init__(self,p1,p2):
self.x = p1.getX() - p2.getX()
self.y = p1.getY() - p2.getY()
#对计算直线进行了定义
self.len = math.sqrt(self.x * self.x + self.y * self.y)
#返回计算结果
def getLen(self):
return self.len
p1 = Point(3,4)
p2 = Point(5,6)
line = Line(p1,p2)
print(line.getLen())
---> 2.8284271247461903
17、聚类的一小段代码
import random
#用作实例和列表的转化
class Sample(object):
"""
样本点类
"""
def __init__(self, coords):
self.coords = coords # 样本点包含的坐标
self.n_dim = len(coords) # 样本点维度
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
class Cluster(object):
"""
聚类
"""
def __init__(self, samples): #传递进来的是实例
self.samples = samples
print('self.samples:',self.samples) --->实例<__main__.Sample object at 0x000000000BF3A160>
print('samples:',samples) --->实例<__main__.Sample object at 0x000000000BF3A160>
print('type_samples:',type(samples)) ---><class '__main__.Sample'>
self.n_dim = samples.n_dim
print('---',self.n_dim) --->实例,调用属性
self.centroid=self.cal_centroid()
def cal_centroid(self):
#实例转化成列表再包个列表
coords=[self.samples.coords]
print('coords:',coords) --->[[138.9937761789476, 7.731482010267521, 197.18620839855782]]
#调用python自带zip()函数
unzipped=zip(*coords)
print(list(unzipped)) --->[(138.9937761789476,), (7.731482010267521,), (197.18620839855782,)]
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
def gen_random_sample(n_dim, lower, upper):
"""
生成随机样本
"""
sample = Sample([random.uniform(lower, upper) for _ in range(n_dim)])
return sample
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#主程序
def run_main():
n_samples = 1
# 特征个数 (特征维度)
n_feat = 3
# 特征数值范围
lower = 0
upper = 200
# 生成随机样本
#列表推导式
samples = [gen_random_sample(n_feat, lower, upper) for _ in range(n_samples)]
#列表内返回的是实例
print('samples:',samples) --->[<__main__.Sample object at 0x000000000BF3A160>]
clusters = []
for s in samples:
#把实例转化为列表
print('s.coords:',s.coords) --->列表[138.9937761789476, 7.731482010267521, 197.18620839855782]
print('type_s.coords:',type(s.coords)) --->type_s.coords: <class 'list'>
print('s:',s) --->实例<__main__.Sample object at 0x000000000BF3A160>
print('type_s:',type(s)) ---><class '__main__.Sample'>
clusters.append(Cluster(s))
print('clusters:',clusters) --->列表内是实例[<__main__.Cluster object at 0x000000000BF3A710>]
for i in clusters:
print()
print('type_clusters',type(i)) ---><class '__main__.Cluster'>
if __name__ == '__main__':
run_main()
18、pandas-数据清理案例
原数据country列的同一行内有各个国家混合在一起,需要将其分开
import pandas as pd
#读入数据
df = pd.read_csv('country_additives.csv',encoding = 'gbk',names = ['country','point'])
#将要处理的列提取出来,然后按","分离
df2 = df['country'].str.split(',',expand=True)
#把分离列和原始列合并
df3 = pd.concat([df,df2],axis = 1)
#提取2列
df4 = df3[['point',0]]
#循环每列,把其添加到df4后面,注意要修改列名称
for i in range(1,14):
df_temp = df3[['point',i]]
df_temp = df_temp.rename(columns={i:0})
df4 = df4.append(df_temp)
#结果
df4