Python基础教程——60个基础练习(三)

41-字符串格式化

"%s is %s years old" % ('bob', 23)  # 常用   
"%s is %d years old" % ('bob', 23)  # 常用   
"%s is %d years old" % ('bob', 23.5)  # %d 是整数 常用   
"%s is %f years old" % ('bob', 23.5)   
"%s is %5.2f years old" % ('bob', 23.5)  # %5.2f 是宽度为 5,2 位小数   
"97 is %c" % 97   
"11 is %#o" % 11  # %#o 表示有前缀的 8 进制   
"11 is %#x" % 11   "%10s%5s" % ('name', 'age')  # %10s 表示总宽度为 10,右对齐,常用   
"%10s%5s" % ('bob', 25)   
"%10s%5s" % ('alice', 23)   
"%-10s%-5s" % ('name', 'age')  # %-10s 表示左对齐,常用   
"%-10s%-5s" % ('bob', 25)   
"%10d" % 123   "%010d" % 123    
     
"{} is {} years old".format('bob', 25)   
"{1} is {0} years old".format(25, 'bob')   
"{:<10}{:<8}".format('name', 'age')   

42-shutil 模块常用方法

import shutil         

with open('/etc/passwd', 'rb') as sfobj:      
 with open('/tmp/mima.txt', 'wb') as dfobj:           
   shutil.copyfileobj(sfobj, dfobj) # 拷贝文件对象         
   
shutil.copyfile('/etc/passwd', '/tmp/mima2.txt')   
shutil.copy('/etc/shadow', '/tmp/')  # cp /etc/shadow /tmp/   
shutil.copy2('/etc/shadow', '/tmp/')  # cp -p /etc/shadow /tmp/   
shutil.move('/tmp/mima.txt', '/var/tmp/')  # mv /tmp/mima.txt /var/tmp/   
shutil.copytree('/etc/security', '/tmp/anquan') # cp -r /etc/security /tmp/anquan   
shutil.rmtree('/tmp/anquan')  # rm -rf /tmp/anquan   # 将 mima2.txt 的权限设置成与/etc/shadow 一样   
shutil.copymode('/etc/shadow', '/tmp/mima2.txt')   
# 将 mima2.txt 的元数据设置成与/etc/shadow 一样   
# 元数据使用 stat /etc/shadow 查看   
shutil.copystat('/etc/shadow', '/tmp/mima2.txt')   
shutil.chown('/tmp/mima2.txt', user='zhangsan', group='zhangsan')   

43-练习:生成文本文件

import os         
def get_fname():       
while True:           
fname = input('filename: ')           
if not os.path.exists(fname):               
break           
print('%s already exists. Try again' % fname)             
return fname        
def get_content():       
content = []       
print('输入数据,输入 end 结束')       
while True:           
line = input('> ')           
if line == 'end':               
break           
content.append(line)             
return content         
def wfile(fname, content):       
with open(fname, 'w') as fobj:           
fobj.writelines(content)         
if __name__ == '__main__':       
fname = get_fname()       
content = get_content()       
content = ['%s\n' % line for line in content]       
wfile(fname, content)   

44-列表方法

alist = [1, 2, 3, 'bob', 'alice']   
alist[0] = 10   
alist[1:3] = [20, 30]   
alist[2:2] = [22, 24, 26, 28]   
alist.append(100)   
alist.remove(24)  # 删除第一个 24   
alist.index('bob')  # 返回下标   
blist = alist.copy()  # 相当于 blist = alist[:]   
alist.insert(1, 15)  # 向下标为 1 的位置插入数字 15   
alist.pop()  # 默认弹出最后一项   
alist.pop(2) # 弹出下标为 2 的项目   
alist.pop(alist.index('bob'))   
alist.sort()   
alist.reverse()   
alist.count(20)  # 统计 20 在列表中出现的次数   
alist.clear()  # 清空   
alist.append('new')   
alist.extend('new')   
alist.extend(['hello', 'world', 'hehe'])   

45-检查合法标识符

import sys   
import keyword   
import string         

first_chs = string.ascii_letters + '_'   
all_chs = first_chs + string.digits         

def check_id(idt):       
if keyword.iskeyword(idt):           
return "%s is keyword" % idt             

if idt[0] not in first_chs:           
return "1st invalid"             

for ind, ch in enumerate(idt[1:]):           
if ch not in all_chs:               
return "char in postion #%s invalid" % (ind + 2)             
return "%s is valid" % idt         
if __name__ == '__main__':       
print(check_id(sys.argv[1]))  # python3 checkid.py abc@123   

46-创建用户,设置随机密码

randpass 模块参见《37-生成密码/验证码》         
import subprocess   
import sys   
from randpass import gen_pass         

def adduser(username, password, fname):       
data = """user information:   
%s: %s   
"""       
subprocess.call('useradd %s' % username, shell=True)       
subprocess.call(           
'echo %s | passwd --stdin %s' % (password, username),           
shell=True       )       
with open(fname, 'a') as fobj:           
fobj.write(data % (username, password))         

if __name__ == '__main__':       
username = sys.argv[1]       
password = gen_pass()       
adduser(username, password, '/tmp/user.txt')  
 # python3 adduser.py john   

47-列表练习:模拟栈操作

stack = []         
def push_it():       
item = input('item to push: ')       
stack.append(item)         
def pop_it():       
if stack:          
print("from stack popped %s" % stack.pop())         
def view_it():       
print(stack)         
def show_menu():       
cmds = {
    
    '0': push_it, '1': pop_it, '2': view_it}  # 将函数存入字典       
prompt = """(0) push it   
(1) pop it   
(2) view it   
(3) exit   
Please input your choice(0/1/2/3): """             

while True:           
# input() 得到字符串,用 strip() 去除两端空白,再取下标为 0 的字符           
choice = input(prompt).strip()[0]           
if choice not in '0123':               
print('Invalid input. Try again.')               
continue                 

if choice == '3':               
break                 

cmds[choice]()    
          
if __name__ == '__main__':       
show_menu()   

48-实现 Linux 系统中 unix2dos 功能

import sys         

def unix2dos(fname):       
dst_fname = fname + '.txt'             

with open(fname) as src_fobj:           
with open(dst_fname, 'w') as dst_fobj:               
for line in src_fobj:                   
line = line.rstrip() + '\r\n'                   
dst_fobj.write(line)         

if __name__ == '__main__':       
unix2dos(sys.argv[1])   

49-动画程序:@从一行#中穿过

#\r 是回车不换行         
import time   
      
length = 19   
count = 0        
 
while True:       
print('\r%s@%s' % ('#' * count, '#' * (length - count)), end='')       
try:           
time.sleep(0.3)       
except KeyboardInterrupt:           
print('\nBye-bye')           
break       
if count == length:           
count = 0       
count += 1   

50-字典基础用法

adict = dict()  # {}   
dict(['ab', 'cd'])   
bdict = dict([('name', 'bob'),('age', 25)])   
{
    
    }.fromkeys(['zhangsan', 'lisi', 'wangwu'], 11)         

for key in bdict:       
print('%s: %s' % (key, bdict[key]))         

print("%(name)s: %(age)s" % bdict)         

bdict['name'] = 'tom'   
bdict['email'] = '[email protected]'         

del bdict['email']   
bdict.pop('age')   
bdict.clear()   

51-字典常用方法

adict = dict([('name', 'bob'),('age', 25)])   
len(adict)   
hash(10)  # 判断给定的数据是不是不可变的,不可变数据才能作为 key   
adict.keys()   
adict.values()   
adict.items()   # get 方法常用,重要   
adict.get('name')  # 取出字典中 name 对应的 value,如果没有返回 None   
print(adict.get('qq'))  # None   
print(adict.get('qq', 'not found'))  # 没有 qq,返回指定内容   
print(adict.get('age', 'not found'))   
adict.update({
    
    'phone': '13455667788'})   

52-集合常用方法

# 集合相当于是无值的字典,所以也用{}表示   
myset = set('hello')   
len(myset)   
for ch in myset:       
print(ch)        

aset = set('abc')  
bset = set('cde')   
aset & bset  # 交集   
aset.intersection(bset)  # 交集   
aset | bset  # 并集   
aset.union(bset)  # 并集   
aset - bset  # 差补   
aset.difference(bset)  # 差补  
aset.add('new')   
aset.update(['aaa', 'bbb'])   
aset.remove('bbb')   
cset = set('abcde')   
dset = set('bcd')   
cset.issuperset(dset)  # cset 是 dset 的超集么?   
cset.issubset(dset)  # cset 是 dset 的子集么?   

53-集合实例:取出第二个文件有,第一个文件没有的行

# cp /etc/passwd .   
# cp /etc/passwd mima   
# vim mima  -> 修改,与 passwd 有些区别        
with open('passwd') as fobj:       
aset = set(fobj)         

with open('mima') as fobj:       
bset = set(fobj)         

with open('diff.txt', 'w') as fobj:       
fobj.writelines(bset - aset)   

54-字典练习:模拟注册/登陆

import getpass         

userdb = {
    
    }         

def register():       
username = input('username: ')       
if username in userdb:           
print('%s already exists.' % username)       
else:           
password = input('password: ')           
userdb[username] = password         

def login():       
username = input('username: ')       
password = getpass.getpass("password: ")       
if userdb.get(username) != password:           
print('login failed')      
else:           
print('login successful')         

def show_menu():       
cmds = {
    
    '0': register, '1': login}       
prompt = """(0) register   
(1) login   
(2) exit   
Please input your choice(0/1/2): """           

while True:              
choice = input(prompt).strip()[0]              
if choice not in '012':                  
print('Invalid inupt. Try again.')                  
continue              
if choice == '2':                  
break                    

cmds[choice]()       

if __name__ == '__main__':       
show_menu()   

55-计算千万次加法运算时间

import time         
result = 0   
start = time.time()  # 返回运算前时间戳   
for i in range(10000000):       
result += i   
end = time.time()   # 返回运算后时间戳   
print(result)   
print(end - start)   

56-时间相关模块常用方法

import time         
t = time.localtime()  # 返回当前时间的九元组   
time.gmtime()  # 返回格林威治 0 时区当前时间的九元组   
time.time()  # 常用,与 1970-1-1 8:00 之间的秒数,时间戳   
time.mktime(t)  # 把九元组时间转成时间戳   
time.sleep(1)   
time.asctime()  # 如果有参数,是九元组形式   
time.ctime()  # 返回当前时间,参数是时间戳,常用   
time.strftime("%Y-%m-%d") # 常用   
time.strptime('2018-07-20', "%Y-%m-%d")  # 返回九元组时间格式   
time.strftime('%H:%M:%S')         

###########################################   
from datetime import datetime   
from datetime import timedelta   datetime.today()  # 返回当前时间的 datetime 对象   
datetime.now()  # 同上,可以用时区作参数   
datetime.strptime('2018/06/30', '%Y/%m/%d')  # 返回 
datetime 对象   
dt = datetime.today()   
datetime.ctime(dt)   
datetime.strftime(dt, "%Y%m%d")    
     
days = timedelta(days=90, hours=3)  # 常用   
dt2 = dt + days   
dt2.year   
dt2.month   
dt2.day   
dt2.hour   

57-os 模块常用方法

import os         
os.getcwd()  # 显示当前路径   
os.listdir()  # ls -a   
os.listdir('/tmp')  # ls -a /tmp   
os.mkdir('/tmp/mydemo')  # mkdir /tmp/mydemo   
os.chdir('/tmp/mydemo')  # cd /tmp/mydemo   
os.listdir()   
os.mknod('test.txt')  # touch test.txt   
os.symlink('/etc/hosts', 'zhuji')  # ln -s /etc/hosts zhuji   
os.path.isfile('test.txt')  # 判断 test.txt 是不是文件   
os.path.islink('zhuji')  # 判断 zhuji 是不是软链接   
os.path.isdir('/etc')   
os.path.exists('/tmp')  # 判断是否存在   
os.path.basename('/tmp/abc/aaa.txt')   
os.path.dirname('/tmp/abc/aaa.txt')   
os.path.split('/tmp/abc/aaa.txt')   
os.path.join('/home/tom', 'xyz.txt')   
os.path.abspath('test.txt')  # 返回当前目录 test.txt 的绝对路径   

58-pickle 存储器

import pickle   
"""以前的文件写入,只能写入字符串,如果希望把任意数据对象(数字、列表等)写入文件,   
取出来的时候数据类型不变,就用到 pickle 了   
"""         

# shop_list = ["eggs", "apple", "peach"]   
# with open('/tmp/shop.data', 'wb') as fobj:   
#     pickle.dump(shop_list, fobj)         

with open('/tmp/shop.data', 'rb') as fobj:       
mylist = pickle.load(fobj)         

print(mylist[0], mylist[1], mylist[2])   

59-异常处理基础

try:   # 把有可能发生异常的语句放到 try 里执行       
n = int(input("number: "))       
result = 100 / n       
print(result)   
except ValueError:       
print('invalid number')   
except ZeroDivisionError:       
print('0 not allowed')   
except KeyboardInterrupt:       
print('Bye-bye')   
except EOFError:       
print('Bye-bye')         
print('Done')   

60-异常处理完整语法

try:       
n = int(input("number: "))       
result = 100 / n   
except (ValueError, ZeroDivisionError):       
print('invalid number')   
except (KeyboardInterrupt, EOFError):       
print('\nBye-bye')   
else:       
print(result)  # 异常不发生时才执行 else 子句   
finally:      
print('Done')  # 不管异常是否发生都必须执行的语句         

# 常用形式有 try-except 和 try-finally

最后这里免费分享给大家一份Python学习资料,包含视频、源码。课件,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。
编程资料、学习路线图、源代码、软件安装包等!【点击这里】领取!
Python所有方向的学习路线图,清楚各个方向要学什么东西
100多节Python课程视频,涵盖必备基础、爬虫和数据分析
100多个Python实战案例,学习不再是只会理论
华为出品独家Python漫画教程,手机也能学习
历年互联网企业Python面试真题,复习时非常方便

- End -

猜你喜欢

转载自blog.csdn.net/2301_78217634/article/details/131766782