目录:
说明:每一个实例都用到了python中的一些特性,需要提前知道以下知识点:
【Python数据类型,列表、字典与集合】https://blog.csdn.net/ck784101777/article/details/103145039
【python字符串与format格式化】https://blog.csdn.net/ck784101777/article/details/103136908
【python模块入门】https://blog.csdn.net/ck784101777/article/details/103098480
【python函数入门,偏函数,匿名函数,递归函数】https://blog.csdn.net/ck784101777/article/details/103195520
【python系统管理模块,shutil,subprocess,os,pickle】https://blog.csdn.net/ck784101777/article/details/103099959
【Python打开文件与读写文件】https://blog.csdn.net/ck784101777/article/details/103095154
【Python *号的含义】https://blog.csdn.net/ck784101777/article/details/103229966
1.判断合法用户
使用到的技术点:if..else判断,隐藏密码(getpass.getpass("")),调用函数
java语言判断可简写为 a=x>y?x:y;
python的判断可以简写为a= x if x 要求 2.编写判断成绩的程序 使用到的技术:#coding: utf8(支持中文) python没有switch..case的语法,所以只能用if..else写 3.编写石头剪刀布小游戏 引用random模块生成0-2的随机数,提示并获取用户的整数输入值,应用if扩展语句对随机数与输入值进行对比判断,满足指定条件,输出结果 为简化代码,玩家获胜条件中用and和or两个逻辑运算符进行多个条件内容的判断,用括号来区分运算优先级,所以用户获胜条件为以下3项中任意一项: 1.用户输入剪刀并且随机数是布 2.用户输入石头并且随机数是剪刀 3.用户输入布并且随机数是石头 版本1:输入数字版本 使用到的技术点: random.randint(n,m)(随机整数),and和or逻辑运算符 版本2:输入字符串版本 使用到的技术点:random.choice([*])随机字符串,%s,%s %(x,y)占位符 版本3:列表判断法 使用到的技术点: [a,b] in 元组 这里使用到了二维元组(二维数组),使用in判断一维元组是否在二维元组中 4.斐波那契数列 使用到的技术点:函数,range,元组,len 函数与java的方法一样,但是不同的是python不需要定义类型,自己用一个字符或字符串即可 range(n) n为一个数字,比如10,range(10)代表从0数到9 元组,元组的[-1]代表最后一个数字,[-2]代表倒数第二个数字 len(元组名)得到元组的长度 5.九九乘法表 使用到的技术:for循环嵌套技术,for循环变量的输出 与c一样,python需要用到占位符,占位符的格式是 ("%d" % (i)) 一定要是双引号,一定要加%,一定要打(),占位符要与后面的实际变量是同一种类型 6.用列表构建栈结构 使用到的技术:列表的内建函数,pop,append 要求: 方案: 创建空列表存储数据,创建4个函数,分别实现压栈、出栈、查询以及判断函数调用的方法。 此程序需要注意的是堆栈的结构特点,先进后出,后进先出: #!/usr/bin/env python3 stack=[] def push_it(): def pop_it(): def view_it(): def show_menu(): while True: if __name__=="__main__": 提示:这里有几个地方要注意 cmds = {'0': push_it, '1': pop_it, '2': view_it} :这里是做了一个集合,根据用户输入的值选取方法 choice=input(prompt).strip()[0] :这里的意思是先对输入值剔除空格。然后取第一个值。因为如果输入12,会没有这个选项,但是这里取0位,系统就会判断选择1 7.模拟用户登陆信息系统 使用到的技术:列表与字典 要求: 方案: 创建空字典存储用户名、密码,用三个函数分别实现用户注册、用户登录以及判断调用函数这三个方法,完成模拟用户登录: #!/usr/bin/env python3 userdb={} #用户注册 def register(): #用户登录 def login(): #显示当前用户 def show_userinfo(): def show_menu(): if __name__=='__main__': 提示:print('\033[31;1mLogin incorrect\033[0m'):这里的\033[31;1m是Linux加颜色操作 cmds={'0':register,'1':login,"2":show_userinfo}:这里是做了一个集合,根据用户输入的值选取方法 choice=input(prompt).strip()[0] :这里的意思是先对输入值剔除空格。然后取第一个值。因为如果输入12,会没有这个选项,但是这里取0位,系统就会判断选择1 8.挑选文件相同的部分 使用到的技术:集合 要求: 方案: #!/usr/bin/env python3 with open('/mnt/123') as f1: with open('/mnt/23') as f2: with open('/mnt/3','w') as f3: 9.挑选文件不相同部分 要求: 方案: #!/usr/bin/env python3 with open('/mnt/123') as f1: with open('/mnt/23') as f2: with open('/mnt/3','w') as f3: 9.记账程序 使用到的技术:python异常,pickle模块,文件创建与打开 要求: 方案: 创建4个函数,分别实现记录开销、记录收入、查询收支、判断函数调用的四个方法,导入时间模块获取时间,导入os模块判断文件是否存在,导入pickle模块用来python特有类型与数据类型转换: 需要注意的是:为确保代码可以正常执行,while循环利用try except语句处理异常,优先匹配特殊异常,让用户按下Ctrl+C或Ctrl+D可以退出程序,遇到索引错误可以结束当次循环,重新开始选择选项。 将记录余额文件以及记账文件作为参数传入函数中 #!/bin/usr/env python3 import time #支出 def spend_money(record,wallet): #流入 def save_money(record,wallet): #查询金额 def query(record,wallet): #打开记录不能 def show_menu(): cmds={'0':spend_money,'1':save_money,'2':query} 10.简单的加减法数学游戏 要求: 方案: 创建4个函数,分别实现返回两数之和、返回两数之差、判断表达式正确性、是否继续计算四种方法: 提示: 1、cmds = {'+': add, '-': sub} 这里采用了字典的方式存储函数,通过关键字来调用函数,是一种良好的编程模式。将实际的‘+’符号联系到函数上。 2、nums = [random.randint(1, 100) for i in range(2)] 这里采用了列表表达式,生成两个1-100的整数 3、nums.sort(reverse=True) 用到了sort内置函数排序,并且是降序排序 4、op = random.choice('+-') result = cmds[op](*nums) 这两句应该是较难理解的地方, cmds[op]其实相当于add(),而(*nums)则相当于两个参数x,y 那么这一句可以等价为 result=add(*nums) 【Python *号的含义】https://blog.csdn.net/ck784101777/article/details/103229966 11.快速排序 要求: 方案: 将要排序的数据分割成独立的三部分,任意选取一个数据作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序,整个排序过程通过递归进行,以此达到整个数据变成有序序列。 一趟快速排序的算法是: 提示:快速排序有几种写法,这里只是一种,利用递归按一个中间值不断将列表分成两部分(大于或小于中间值),当一个部分的长度为1时返回,再将两部分合成一部分,并返回 12.备份程序 要求: 方案: 整体框架创建3个函数,分别实现完全备份、增量备份、文件加密3种功能: #!/usr/bin/env pythoy3 import time #用于判断两个文件是否相同,提取每个文件中的前4字节的内容然后输出md5码进行比较 def check_md5(fname): #完全备份 #src_dir(被备份的文件),dst_dir(将次文件备份到哪),md5file(摘要值记录文件) def full_backup(src_dir,dst_dir,md5file): #备份文件 tar=tarfile.open(fname,'w:gz') #更新摘要值 for path,folders,files in os.walk(src_dir): #将摘要值存入文件 with open(md5file,'wb') as f: #增量备份 #src_dir(被备份的文件),dst_dir(将次文件备份到哪),md5file(老的摘要值) def incr_backup(src_dir,dst_dir,md5file): with open(md5file,'rb') as f: #打开老的MD5文件 for path, folders, files in os.walk(src_dir): #记录新的MD5摘要值 for each_file in files: key = os.path.join(path, each_file) md5dict[key] = check_md5(key) with open(md5file, 'wb') as fobj: pickle.dump(md5dict, fobj) with open(md5file,'wb') as f: #将新的MD5文件写到md5dict集合中 tar=tarfile.open(fname,'w:gz') if __name__ == '__main__': # mkdir /tmp/demo; cp -r /var/log /tmp/demo 将日志文件作为实验读写 src_dir = '/tmp/demo/log' #源文件 dst_dir = '/var/tmp/backup' # mkdir /var/tmp/backup 压缩包存放的位置 md5file = '/var/tmp/backup/md5.data' #MD5摘要信息存放文件 if time.strftime('%a') == 'Mon': #获取日期,当周一时触发完全备份 full_backup(src_dir, dst_dir, md5file) else: #获取日期,非周一时触发增量备份 incr_backup(src_dir, dst_dir, md5file) 提示:本实验难点较大,主要有以下二点 1.解压模块tarfile,了解如何压缩文件与添加新的文件到老的压缩文件中 2.摘要信息模块hashlib,了解如何获取文件的摘要信息 13.小实验2--扫描存活主机 需求: 我们可以写一个python脚本,扫描局域网所有的存活主机,如果懂ip协议的话,可以知道局域网的ip有其专用地址,如下 IPv4专用地址如下: Class A 10.0.0.0-10.255.255.255 默认子网掩码:255.0.0.0 Class B 172.16.0.0-172.31.255.255 默认子网掩码:255.240.0.0 Class C 192.168.0.0-192.168.255.255 默认子网掩码:255.255.0.0 这里只举例ping一个网段,读者可以尝试用多个循环去完成实验 要求: 创建mtping.py脚本,实现以下功能: 方案: 实现此案例需要按照如下步骤进行。 步骤一:编写脚本 面向对象代码编写方式如下: 步骤二:测试脚本执行 总结: 以上提供了两种编程思路,一个是传递可调用类给Thread类,第二个是传递可调用函数给Thead类,推荐使用第一种方法。
item=input('item to push:')
stack.append(item)
if stack:
print("\033[31;1mPopped %s\033[0m" % stack.pop())
else:
print('\033[31;1mEmpty stack\033[0m')
print("\033[32;1m%s\033[0m" % stack)
prompt="""(0) push_it
(1) pop_it
(2) view_it
(3) quit
Please input you choice(0/1/2/3):"""
cmds = {'0': push_it, '1': pop_it, '2': view_it}
choice=input(prompt).strip()[0]
if choice not in '0123':
print('Invalid input.Try again')
continue
if choice=='3':
break
cmds[choice]()
show_menu()
username=input('username:')
if username in userdb:
print('\033[31;1m%s already exists.\033[0m' % username)
else:
password=input('password:')
userdb[username]=password
username=input('username:')
password=input('password:')
if userdb.get(username)!=password:
print('\033[31;1mLogin incorrect\033[0m')
else:
print('\033[32;1mLogin successful\033[0m')
print(userdb)
prompt="""(0)regiter
(1)login
(2)userinfos
(3)quit
Please input you choice(0/1/2/3):"""
cmds={'0':register,'1':login,"2":show_userinfo}
while True:
choice=input(prompt).strip()[0]
if choice not in '0123':
print('Invalid choice.Try again')
continue
if choice=='3':
break
cmds[choice]()
show_menu()
aset=set(f1)
bset=set(f2)
f3.writelines(aset&bset)
aset=set(f1)
bset=set(f2)
f3.writelines(aset-bset)
#encode=utf-8
import os
import pickle as p
date=time.strftime("%Y-%m-%d") #获取时间
amount=int(input('金额:')) #支出金额
comment=input('备注:')
with open(wallet,'rb') as f: #读取余额
balance=p.load(f)-amount #剩余金额=账户金额-支出金额
with open(wallet,'wb') as f:
p.dump(balance,f) #写入账户
with open(record,'a') as f: #将这笔交易记录写入文本
f.write(
"%-20s-%-20s%-10s%-20s\n"
% (date,amount,balance,comment)
)
date=time.strftime('%Y-%m-%d')
amount=int(input('金额:'))
comment=input('备注: ')
with open(wallet,'rb') as f: #获取金额
balance=p.load(f)+amount #剩余金额=流入金额+账户金额
with open(wallet,'wb') as f:
p.dump(balance,f) #写入账户
with open(record,'a') as f: #将这笔交易记录写入文本
f.write(
"%-20s+%-20s%-10s%-20s\n" %
(date,amount,balance,comment)
)
with open(record) as f:
for line in f:
print(line,end="") #输出每行内容
with open(wallet,'rb') as f:
balance=p.load(f)
print('当前余额 %s' % balance)
prompt=""" (0) 记录开销
(1) 纪录收入
(2) 查询记录
(3) 退出
请选择(0/1/2/3):"""
record='record.txt'
wallet='wallet.data'
if not os.path.exists(wallet): #初始化创建账本
with open(wallet,'wb') as f:
p.dump(10000,f)
if not os.path.exists(record): #初始化创建记录本
with open(record,'a') as f:
f.write(
"%-20s%-15s%-10s%-20s\n" %
("时间","流入(+)/支出(-)","余额","备注")
)
while True:
try:
choice=input(prompt).strip()[0] #获取输入结果,必须为数字
except IndexError:
continue
except (KeyboardInterrupt,EOFError):
print('\nBye-bye')
choice='3'
if choice not in '0123':
print('无效输入,请重试')
continue
if choice == '3':
break
cmds[choice](record,wallet)
if __name__ == '__main__':
show_menu()
import os
import tarfile
import hashlib
import pickle
m = hashlib.md5()
with open(fname, 'rb') as fobj:
while True:
data = fobj.read(4096)
if not data:
break
m.update(data)
return m.hexdigest()
fname='%s_full_%s.tar.gz' % (fname,time.strftime('%Y%m%d')) #获取当前时间
fname=os.path.join(dst_dir,fname) #将格式转换为 :/文件目录/%s_full_%s.tar.gz
md5dict={}
tar.add(src_dir)
tar.close()
for each_file in files:
key=os.path.join(path,each_file)
md5dict[key]=check_md5(key)
pickle.dump(md5dict,f)
fname='%s_incr_%s.tar.gz' % (fname,time,strftime('%Y%m%d'))
fname=os.path.join(dst_dir,fname)
md5dict={}
oldmd5=pickle.load(f)
pickle.dump(md5dict,f)
for key in md5dict: #新的MD5值与老的MD5值对比
if oldmd5.get(key) != md5dict[key]
tar.add(key)
tar.close()