Python编程案例

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、判断字母、空格、数字

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、递归法拆分数字

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、打印指定文件夹下的所有文件类型数量

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、计算当前文件夹下所有文件的大小

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、查找目录下的指定视频文件格式

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、异常处理的另类用法

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容