当前位置:   article > 正文

python编程案列教程,python编程简单案例_python编程案例教程

python编程案例教程

大家好,小编为大家解答python编程案列教程的问题。很多人还不知道python编程简单案例,现在让我们一起来看看吧!

python编程实例

01-Hello World

01-Hello World

python 的语法逻辑完全靠缩进,建议缩进4个空格

如果是顶级代码,必须顶格书写,哪怕只有一个空格也会语法错误

下面实例中,满足if条件要输出两行内容,这两行内容必须都缩进,而且具有相同的缩进级别。

  1. print("hello world")
  2. if 3 > 0:
  3. print("OK")
  4. print("yes")
  5. x = 3; y = 4 #不推荐,还是应该写成两行
  6. print(x + y)

02-print

  1. print("hello world") #hello world
  2. print("hello","world") #逗号自动添加默认的分隔符 hello world
  3. print("hello" + "world") #加号表示字符拼接 helloworld
  4. print("hello","world",sep="***") #单词间用***分隔 hello***world
  5. print("*" * 10) #*号重复10遍 **********
  6. print("how are you?",end="") #默认print会打印回车,end=""表示不要回车

03-基本运算

运算符可以分为:算术运算符、比较运算符和逻辑运算符火车头采集器AI伪原创。优先级是:算术运算符>比较运算符>逻辑运算符。不过呢,没记住优先级,最好使用括号,这样不用背,也增加了代码的可读性。

  1. print(5 / 2) #2.5
  2. print(5 // 2) #丢弃余数,只保留商 2
  3. print(5 % 2) #求余数 1
  4. print(5 ** 3) #求5的3次方 125
  5. print(5 > 3)#返回True
  6. print(3 > 5)#返回False
  7. print(20 > 10 >5) #python支持连续比较 True
  8. print(20 >10 and 10 >5) #python支持连续比较,与上面相同含义 True
  9. print(not 20 > 10) #False
  10. print(not 10 > 20) #True

True和False是关键字,区分大小写

04-input

  1. number = input("请输入数字:") #input用于获取键盘输入 20
  2. print(number) # 20
  3. print(type(number)) #input获得的数据是字符型 <class 'str'>
  4. #print(number + 10) #报错,不能把字符和数字做运算 TypeError: must be str, not int
  5. print(int(number) + 10) #int可将字符10转换成数字10 30
  6. print(number + str(10)) #str可将10转换为字符串后实现字符串拼接 2010

05-输入输出基础练习

  1. username = input("username: ") #刘备
  2. print("welcome",username) #print各项间默认以空格作为分隔符 welcome 刘备 逗号默认中间有一个空格
  3. print("welcome " + username) #注意引号内最后的空格 welcome 刘备 第一个字符串中包含两个空格

06-字符串使用基础

python中,单双引号在字符串中使用,没有区别

  1. sentence = 'tom\'s pet is a cat' #单引号中间还有单引号,可以转义
  2. sentence2 = "tom's pet is a cat" #也可以用双引号包含单引号
  3. sentence3 = "tom said:\"hello world!\""
  4. sentence4 = 'tom said:"hello world!"' #单引号中间可以用双引号,可以转义
  5. #三个连续的三引号或单引号,可以保存输入格式,允许输入多行字符串
  6. words = """
  7. hello
  8. world
  9. abcd"""
  10. print(words)
  11. #hello
  12. #world
  13. #abcd
  14. py_str = 'python'
  15. print(len(py_str)) #取长度 6
  16. print(py_str[0]) #取第一个字符 p
  17. print('python'[0]) #取第一个字符 p
  18. print(py_str[-1]) #取最后一个字符 n
  19. #print(py_str[6]) #错误,下表超出范围 IndexError: string index out of range
  20. print(py_str[2:4]) #切片,起始下标包含,结束下标不包含 th
  21. print(py_str[2:]) #从下标为2的字符渠道结尾 thon
  22. print(py_str[:2]) #从开头取到下标为2之前的字符 py
  23. print(py_str[:]) #取全部 python
  24. print(py_str[::2]) #按照步长为2取值,默认为1 pto
  25. print(py_str[1::2]) #以下标为1开始,步长为2取值 yhn
  26. print(py_str[::-1]) #步长为负,表示从右往左取 nohtyp
  27. print(py_str + 'is good') #简单拼接在一起 pythonis good
  28. print(py_str * 3) #把字符串重复3遍 pythonpythonpython
  29. print('t' in py_str) #True
  30. print('th' in py_str) #True
  31. print('to' in py_str) #False 子字符串必须连续
  32. print('to' not in py_str) #True

07-列表基础

列表也是序列对象,但它是容器类型,列表中可以包含各种数据,列表可变

  1. alist = [10,20,30,'bob','alice',[1,2,3]]
  2. print(len(alist)) #6
  3. print(alist[-1]) #取出最后一项 [1, 2, 3]
  4. print(alist[-1][-1]) #因为最后一项是列表,还可以继续取下标 3
  5. print(alist[-2][2]) #列表倒数第二项是字符串,还可以继续取下标 i
  6. print(alist[3:5]) #['bob','alice']
  7. print(10 in alist) #True
  8. print('o' in alist) #False
  9. print(100 not in alist) #True
  10. alist[-1] = 100 #修改最后一项的值
  11. print(alist) # [10, 20, 30, 'bob', 'alice', 100]
  12. alist.append(200) #向列表中追加一项
  13. print(alist) #[10, 20, 30, 'bob', 'alice', 100, 200]

08-元组基础

元组与列表基本上是一致的,只是元组不可变,列表可变

  1. atuple = (10,20,30,'bob','alice',[1,2,3])
  2. print(len(atuple)) #6
  3. print(atuple[2]) #30
  4. print(atuple[-1]) #[1, 2, 3]
  5. print(atuple[3:5]) #('bob','alice')
  6. print(10 in atuple) #True
  7. atuple[-1] = 100 #错误,元组是不可变的 TypeError: 'tuple' object does not support item assignment

09-字典基础

  1. #字典是key-value(键-值)对形式的,没有顺序,通过键取值
  2. adict = {'name':'bob','age':23}
  3. print(len(adict)) #2
  4. print('bob' in adict) #False
  5. print('name' in adict) #True
  6. adict['email'] = 'bob@163.com' #字典中没有的key,则添加
  7. print(adict) #{'name': 'bob', 'age': 23, 'email': 'bob@163.com'}
  8. adict['age'] = 25 #字典中已有的key,修改对应的value
  9. print(adict) #{'name': 'bob', 'age': 25, 'email': 'bob@163.com'}

10-基本判断

单个数据也可作为判断条件

任何值为0的数字、空对象都是False,任何非0数字、非空对象都是True.

  1. if 3 > 0:
  2. print('yes')
  3. print('ok')
  4. if 10 in [10,20,30]:
  5. print('ok')
  6. if -0.0:
  7. print('yes') #任何值为0的数字都是False
  8. if [1,2]:
  9. print('yes') #非空对象都是True
  10. if ' ':
  11. print('yes') #空格字符也是字符,条件为True

11-条件表达式、三元运算符

  1. a = 10
  2. b = 20
  3. if a < b:
  4. smaller = a
  5. else:
  6. smaller = b
  7. print(smaller) #10
  8. s = a if a < b else b #和上面的if-else语句等价
  9. print(s) #10

12-判断练习:用户名和密码是否正确

  1. import getpass #导入模块
  2. username = input('username:')
  3. #getpass模块中,有一个方法也叫getass
  4. password = getpass.getpass('password:')
  5. if username == 'bob' and password == '123456':
  6. print('Login successful')
  7. else:
  8. print('Login incorrect')

13-成绩分类

  1. score = int(input('分数:'))
  2. if score >=90:
  3. print('优秀')
  4. elif score >=80:
  5. print('好')
  6. elif score >=70:
  7. print('良')
  8. elif score >=60:
  9. print('及格')
  10. else:
  11. print('你要努力了')

14-石头剪刀布

  1. import random
  2. all_choices = ["石头","剪刀","布"]
  3. computer = random.choice(all_choices)
  4. player = input('请出拳:')
  5. # print('Your choice:',player,"Computer's choice:",computer)
  6. print("Your choice:%s,Computer's choice:%s" %(player,computer))
  7. if player == "石头":
  8. if computer == "石头":
  9. print("平局")
  10. elif computer == "剪刀":
  11. print("You Win!!!")
  12. else:
  13. print("You Lose!!!")
  14. elif player == "剪刀":
  15. if computer == "石头":
  16. print("You Lose!!!")
  17. elif computer == "剪刀":
  18. print("平局")
  19. else:
  20. print("You Win!!!")
  21. else:
  22. if computer == "石头":
  23. print("You Win!!!")
  24. elif computer == "剪刀":
  25. print("You Lose!!!")
  26. else:
  27. print("平局")

15-改进的石头剪刀布

  1. import random
  2. all_choices = ["石头","剪刀","布"]
  3. win_list = [["石头","剪刀"],["剪刀","布"],["布","石头"]]
  4. prompt = '''(0)石头
  5. (1)剪刀
  6. (2)布
  7. 请选择(0/1/2)'''
  8. computer = random.choice(all_choices)
  9. ind = int(input(prompt))
  10. player = all_choices[ind]
  11. print("Your choice:%s,Computer's choice:%s" %(player,computer))
  12. if player == computer:
  13. print('\033[32;1m平局\033[0m')
  14. elif [player,computer] in win_list:
  15. print('\033[31;1mYou Win!!!\033[0m')
  16. else:
  17. print('\033[31;1mYou Lose!!!\033[0m')

16-猜数:基础实现

  1. import random
  2. num = random.randint(1,10) #随机生成1-10之间的数字
  3. answer = int(input('guess a number:')) #将用户输入的字符转换为整数
  4. if answer > num:
  5. print("猜大了")
  6. elif answer < num:
  7. print("猜小了")
  8. else:
  9. print("猜对了")
  10. print('the number:',num)

17-猜数,直到猜对

  1. import random
  2. num = random.randint(1,10) #随机生成1-10之间的数字
  3. running = True
  4. while running:
  5. answer = int(input('guess a number:')) #将用户输入的字符转换为整数
  6. if answer > num:
  7. print("猜大了")
  8. elif answer < num:
  9. print("猜小了")
  10. else:
  11. print("猜对了")
  12. running = False

18-猜数,5次机会

  1. import random
  2. num = random.randint(1,10) #随机生成1-10之间的数字
  3. counter = 0
  4. while counter < 5:
  5. answer = int(input('guess a number:')) #将用户输入的字符转换为整数
  6. if answer > num:
  7. print("猜大了")
  8. elif answer < num:
  9. print("猜小了")
  10. else:
  11. print("猜对了")
  12. break
  13. counter +=1
  14. else: #循环被break就不执行了,没有break才执行
  15. print('the number is :',num)

19-while循环,累加至100

因为循环次数是已知的,实际使用时,建议用for循环

  1. sum100 = 0
  2. counter = 1
  3. while counter < 101:
  4. sum100 +=counter
  5. counter +=1
  6. print(sum100) #5050

20-while-break

break是结束循环,break之后、循环体内代码不在执行

  1. while True:
  2. yn = input('Continue(y/n): ')
  3. if yn in ['n','N']:
  4. break
  5. print('running...')

21-while-continue

计算100以内偶数之和

continue是跳过本次循环剩余部分,回到循环条件处。

  1. sum100 = 0
  2. counter = 0
  3. while counter < 100:
  4. counter +=1
  5. if counter %2 ==1:
  6. continue
  7. sum100 += counter
  8. print(sum100) #2550

22-for 循环遍历数据对象

  1. astr = 'hello'
  2. alist = [10,20,30]
  3. atuple = ('bob','tom','alice')
  4. adict = {'name':'john','age':23}
  5. for ch in astr:
  6. print(ch)
  7. for i in alist:
  8. print(i)
  9. for name in atuple:
  10. print(name)
  11. for key in adict:
  12. print('%s:%s'%(key,adict[key]))

23-range用法及数字累加

  1. print(range(10)) #range(0,10)
  2. print(list(range(10))) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  3. print(list(range(6,11))) #[6, 7, 8, 9, 10]
  4. print(list(range(1,10,2))) #[1, 3, 5, 7, 9]
  5. print(list(range(10,0,-1))) #[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
  6. sum100 =0
  7. for i in range(1,101):
  8. sum100 += i
  9. print(sum100) #5050

24-列表实现斐波那契数列

列表中先给定两个数字,后面的数字总是前两个数字之和

  1. fib = [0,1]
  2. for i in range(8):
  3. fib.append(fib[-1] + fib[-2])
  4. print(fib)

25-九九乘法表

  1. for i in range(1,10):
  2. for j in range(1,i + 1):
  3. print('%s*%s=%s' % (j,i,i*j),end=' ')
  4. print() #没有将会把结果打印到一行,换行的作用
  5. # i = 1 ->j:[1]
  6. # i = 2 ->j:[1,2]
  7. # i = 3 ->j:[1,2,3]
  8. #或者由用户指定相乘到多少
  9. n = int(input('number:'))
  10. for i in range(1,n + 1):
  11. for j in range(1, i + 1):
  12. print('%s*%s=%s' % (j,i,i*j),end=' ')
  13. print()

26-逐步实现列表解析

  1. #10+5的结果放到列表中
  2. [10 + 5]
  3. #10+5这个表达式计算10次
  4. [10 + 5 for i in range(10)]
  5. #10+i的i来自于循环
  6. [10 + i for i in range(10)]
  7. [10 + i for i in range(1,11)]
  8. #通过if过滤,满足if条件的才参与10+i的运算
  9. [10 + i for i in range(1,11) if i %2 == 1]
  10. [10 + i for i in range(1,11) if i %2]
  11. #生成IP地址列表
  12. ['192.168.1.%s' %i for i in range(1,255)]

27-三局两胜的石头剪刀布

  1. import random
  2. all_choices = ["石头","剪刀","布"]
  3. win_list = [["石头","剪刀"],["剪刀","布"],["布","石头"]]
  4. prompt = '''(0)石头
  5. (1)剪刀
  6. (2)布
  7. 请选择(0/1/2):'''
  8. cwin = 0 #电脑赢
  9. pwin = 0 #玩家赢
  10. while cwin < 2 and pwin <2 :
  11. computer = random.choice(all_choices)
  12. ind = int(input(prompt))
  13. player = all_choices[ind]
  14. print("Your choice:%s,Computer's choice:%s" %(player,computer))
  15. if player == computer:
  16. print('\033[32;1m平局\033[0m')
  17. elif [player,computer] in win_list:
  18. pwin += 1
  19. print('\033[31;1mYou Win!!!\033[0m')
  20. else:
  21. cwin += 1
  22. print('\033[31;1mYou Lose!!!\033[0m')

28-文件对象基础操作

  1. #文件操作的三个步骤:打开、读写、关闭
  2. #cp /etc/passwd/tmp
  3. f = open('/tmp/passwd') #默认以r的方式打开纯文本文件
  4. data = f.read() #read()把所有内容读取出来
  5. print(data)
  6. data = f.read() #随着读写的进行,文件指针向后移动
  7. #因为第一个f.read()已经把文件指针移动到结尾了,所以再读就没有数据了
  8. #所以data是空字符串
  9. f.close()
  10. #############################################
  11. f = open('/tmp/passwd')
  12. data01 = f.read(4) #读4字节
  13. f.readline() #读到换行符\n结束
  14. f.readlines() #把每一行数据读出来放到列表中
  15. f.close()
  16. ##############################################
  17. f = open('/tmp/passwd')
  18. for line in f:
  19. print(line,end='')
  20. f.close()
  21. ##############################################
  22. f = open('图片地址','rb') #打开非文本文件要加参数b
  23. f.read(4096)
  24. f.close()
  25. ##############################################
  26. f = open('/tmp/myfile','w') #'w'打开文件,如果文件不存在则创建
  27. f.write('hello world!\n')
  28. f.flush() #立即将缓存中的数据同步到磁盘
  29. f.writelines(['2nd line.\n','new line.\n'])
  30. f.close() #关闭文件的时候,数据保存到磁盘
  31. #############################################
  32. with open('/tmp/passwd') as f:
  33. print(f.readline())
  34. ##############################################
  35. f = open('/tmp/passwd')
  36. f.tell() #查看文件指针的位置
  37. f.readline()
  38. f.tell()
  39. f.seek(0,0) #第一个数字是偏移量,第二个数字是相对位置 #相对位置0表示开头,1表示当前,2表示结尾
  40. f.tell()
  41. f.close()

29-拷贝文件-1

拷贝文件就是以r的方式打开源文件,以w的方式打开目标文件,将源文件数据读出后,写到目标文件。以下是【不推荐】的方式,但是可以工作。

  1. f1 = open('/bin/ls','rb')
  2. f2 = open('/root/ls','wb')
  3. data = f1.read()
  4. f2.write(data)
  5. f1.close()
  6. f2.close()

30-拷贝文件-2

每次读取4k,读完为止:

  1. src_fname = '/bin/ls' #源文件名称
  2. dst_fname = '/root/ls' #目标文件名称
  3. src_fobj = open(src_fname,'rb')
  4. dst_fobj = open(dst_fname,'wb')
  5. while True:
  6. data = src_fobj.read(4096)
  7. if not data:
  8. break
  9. dst_fobj.write(data)
  10. src_fobj.close()
  11. dst_fobj.close()

31-位置参数

注意:位置参数中的数字是字符形式的

  1. import sys
  2. print(sys.argv) #sys.argv是sys模块里的argv列表
  3. # python3 position_args.py
  4. # python3 position_args.py 10
  5. # python3 position_args.py 10 bob

32-函数应用-菲波那契数列

  1. def gen_fib(l):
  2. fib = [0,1]
  3. for i in range(l - len(fib)):
  4. fib.append(fib[-1] + fib[-2])
  5. return fib #返回列表,不返回变量fib
  6. a = gen_fib(10)
  7. print(a) #[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
  8. print('-'*10) #----------
  9. n = int(input("length:"))
  10. print(gen_fib(n)) #不会把变量n传入,是把n代表的值赋值给形参 #length:

33-函数-拷贝文件

  1. import sys
  2. def copy(src_fname,dst_fname): #src_fname源文件名称,dst_fname目标文件名称
  3. src_fobj = open(src_fname,'rb')
  4. dst_fobj = open(dst_fname,'wb')
  5. while True:
  6. data = src_fobj.read(4096)
  7. if not data:
  8. break
  9. dst_fobj.write(data)
  10. src_fobj.close()
  11. dst_fobj.close()
  12. copy(sys.argv[1],sys.argv[2])
  13. #执行方式
  14. # cp_func.py /etc/hosts /tmp/zhuji.txt

34-函数-九九乘法表

  1. def matble(n):
  2. for i in range(1,n + 1):
  3. for j in range(1,i + 1):
  4. print('%s*%s=%s' % (j,i,i*j),end=' ')
  5. print() #没有将会把结果打印到一行,换行的作用
  6. matble(6)
  7. matble(9)

35-模块基础

每一个以py作为扩展名的文件都是一个模块

  1. # 创建star.py文件
  2. hi = 'hello world!'
  3. def pstar(n=50):
  4. print('*' * n)
  5. if __name__=='__main__':
  6. pstar() #**************************************************
  7. pstar(30) #******************************

新建call_star.py并调用star模块:

  1. import star
  2. print(star.hi) #hello world!
  3. star.pstar() #**************************************************
  4. star.pstar(20)#********************

36-生成密码/验证码

此文件名:randpass.py

思路:

1、设置一个用于随机取出字符的基础字符串,本例使用大小写字母加数字

2、循环n次,每次随机取出一个字符

3、将各个字符拼接起来,保存到变量result中

  1. from random import choice
  2. import string
  3. all_chs = string.ascii_letters + string.digits #大小写字母加数字
  4. def gen_pass(n = 8):
  5. result = ''
  6. for i in range(n):
  7. ch = choice(all_chs)
  8. result += ch
  9. return result
  10. if __name__ == '__main__':
  11. print(gen_pass()) #随机的8位密码
  12. print(gen_pass(4)) #随机的4位密码
  13. print(gen_pass(10)) #随机的10位密码

37-序列对象方法-1

  1. from random import randint
  2. alist = list() #[]
  3. print(alist)
  4. print(list('hello')) #['h', 'e', 'l', 'l', 'o']
  5. print(list((10,20,30))) #[10,20,30]元组转列表
  6. astr = str()
  7. print(astr) #''
  8. print(str(['h', 'e', 'l', 'l', 'o'])) #将列表转换为字符串 #['h', 'e', 'l', 'l', 'o']为一个字符串
  9. atuple = tuple() #()
  10. print(tuple('hello')) #('h', 'e', 'l', 'l', 'o')
  11. num_list = [randint(1,100) for i in range(10)]
  12. print(max(num_list))
  13. print(min(num_list))

38-序列对象方法-2

  1. alist = [10,'john']
  2. # list(enumerate(alist)) #[(0,10),(1,'john')]
  3. # a,b = 0,10 #a->0 ->10
  4. for ind in range(len(alist)):
  5. print('%s:%s' % (ind,alist[ind]))
  6. for item in enumerate(alist):
  7. print('%s:%s' % (item[0],item[1]))
  8. for ind,val in enumerate(alist):
  9. print('%s:%s' % (ind,val))
  10. atuple = (96,97,40,75,58,34,69,29,66,90)
  11. result01 = sorted(atuple)
  12. print(result01) #[29, 34, 40, 58, 66, 69, 75, 90, 96, 97]
  13. result02 = sorted('hello')
  14. print(result02) #['e', 'h', 'l', 'l', 'o']
  15. for i in reversed(atuple):
  16. print(i,end=',') #90,66,29,69,34,58,75,40,97,96,

39-字符串方法

  1. py_str = 'hello world!'
  2. print(py_str.capitalize()) #Hello world!第一个字母大写
  3. print(py_str.title()) #Hello World!每个单词首字母大写
  4. print(py_str.center(50)) # hello world! 位于50字节中间,没有字符处为空格填充
  5. print(py_str.center(50,'#')) # ###################hello world!###################
  6. print(py_str.ljust(50,'*')) # hello world!**************************************
  7. print(py_str.rjust(50,'*')) # **************************************hello world!
  8. print(py_str.count('l')) #统计l出现的次数 3
  9. print(py_str.count('lo')) #统计lo出现的次数 1
  10. print(py_str.endswith('d!')) #是否以d!结尾? True
  11. print(py_str.startswith('a')) #是否以a开头? False
  12. print(py_str.islower()) #字母是否都是小写的?其他字符不考虑 True
  13. print(py_str.isupper()) #字母是否都是大写的?其他字符不考虑 False
  14. print('Hao123'.isdigit()) #所有字符都是数字吗? False
  15. print('Hao123'.isalnum()) #所有字符都是字母数字吗? True
  16. print(' hello\t '.strip()) #去除两端空白字符,常用 hello
  17. print(' hello\t '.lstrip()) # hello
  18. print(' hello\t '.rstrip()) # hello
  19. print('how are you?'.split()) # ['how', 'are', 'you?']
  20. print('hello.tar.gz'.split('.')) #['hello', 'tar', 'gz']
  21. print('.'.join(['hello','tar','gz'])) #hello.tar.gz
  22. print('-'.join(['hello','tar','gz'])) #hello-tar-gz

40-字符串格式化

  1. print("%s is %s years old" % ('bob',23)) #常用 bob is 23 years old
  2. print("%s is %d years old" % ('bob',23)) #常用 bob is 23 years old
  3. print("%s is %d years old" % ('bob',23.5)) # %d是整数 常用 bob is 23 years old
  4. print("%s is %f years old" % ('bob',23.5)) # bob is 23.500000 years old
  5. print("%s is %5.2f years old" % ('bob',23.5)) # %5.2f是宽度为5,2位小数 bob is 23.50 years old
  6. print("97 is %c" % 97) # 97 is a
  7. print("11 is %#o" % 11) # %#o表示有前缀的8进制 11 is 0o13
  8. print("11 is %#x" % 11) # 11 is 0xb
  9. print("%10s%5s" % ('name','age')) # %10s表示总宽度为10,右对齐,常用 name age
  10. print("%10s%5s" % ('bob',25)) # bob 25
  11. print("%10s%5s" % ('alice',23)) # alice 23
  12. print("%-10s%-5s" % ('name','age')) # %-10s表示左对齐,常用 name age
  13. print("%-10s%-5s" % ('bob',25)) # bob 25
  14. print("%10d" % 123) # 123
  15. print("%010d" % 123) # 0000000123
  16. print("{} is {} years old".format('bob',25)) # bob is 25 years old
  17. print("{1} is {0} years old".format(25,'bob')) # bob is 25 years old
  18. print("{:<10}{:<8}".format('name','age')) # name age

41-shutil模块常用方法

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

42-练习:生成文本文件

  1. import os
  2. def get_fname():
  3. while True:
  4. fname = input('filename:')
  5. if not os.path.exists(fname):
  6. break
  7. print('%s already exists.Try again' % fname)
  8. return fname
  9. def get_content():
  10. content = []
  11. print('输入数据,输入end结束')
  12. while True:
  13. line = input('>')
  14. if line == 'end':
  15. break
  16. content.append(line)
  17. return content
  18. def wfile(fname,content):
  19. with open(fname,'w') as fobj:
  20. fobj.writelines(content)
  21. if __name__ == '__main__':
  22. fname = get_fname()
  23. content = get_content()
  24. content = ['%s\n' % line for line in content]
  25. wfile(fname,content)

43-列表方法

  1. alist = [1,2,3,'bob','alice']
  2. alist[0] = 10
  3. print(alist) #[10, 2, 3, 'bob', 'alice']
  4. alist[1:3] = [20,30]
  5. print(alist) #[10, 20, 30, 'bob', 'alice']
  6. alist[2:2] = [22,24,26,28]
  7. print(alist) #[10, 20, 22, 24, 26, 28, 30, 'bob', 'alice']
  8. alist.append(100)
  9. print(alist) #[10, 20, 22, 24, 26, 28, 30, 'bob', 'alice', 100]
  10. alist.remove(24) #删除第一个24
  11. print(alist) #[10, 20, 22, 26, 28, 30, 'bob', 'alice', 100]
  12. print(alist.index('bob')) #返回下标 6
  13. blist = alist.copy() #相当于blist = alist[:]
  14. print(blist) #[10, 20, 22, 26, 28, 30, 'bob', 'alice', 100]
  15. alist.insert(1,15) #在下标为1的位置插入数字15
  16. print(alist) #[10, 15, 20, 22, 26, 28, 30, 'bob', 'alice', 100]
  17. alist.pop() #默认弹出最后一项
  18. print(alist) #[10, 15, 20, 22, 26, 28, 30, 'bob', 'alice']
  19. alist.pop(2) #弹出下标为2的一项
  20. print(alist) #[10, 15, 22, 26, 28, 30, 'bob', 'alice']
  21. alist.pop(alist.index('bob')) #
  22. print(alist) #[10, 15, 22, 26, 28, 30, 'alice']
  23. # alist.sort() #错误 TypeError: '<' not supported between instances of 'str' and 'int'
  24. # print(alist)
  25. alist.reverse() #列表反转
  26. print(alist) #['alice', 30, 28, 26, 22, 15, 10]
  27. print(alist.count('new')) #列表中new的个数 0
  28. alist.extend('new')
  29. print(alist) #['alice', 30, 28, 26, 22, 15, 10, 'n', 'e', 'w']
  30. alist.extend(['hello','world','hehe'])
  31. print(alist) #['alice', 30, 28, 26, 22, 15, 10, 'n', 'e', 'w', 'hello', 'world', 'hehe']

44-检查合法标识符

  1. import sys
  2. import keyword
  3. import string
  4. first_chs = string.ascii_letters + '-'
  5. all_chs = first_chs + string.digits
  6. def check_id(idt):
  7. if keyword.iskeyword(idt):
  8. return "%s is keyword" % idt
  9. if idt[0] not in first_chs:
  10. return "1st invaild"
  11. for ind,ch in enumerate(idt[1:]):
  12. if ch not in all_chs:
  13. return "char in position #%s invaild" % (ind + 2)
  14. return "%s is vaild" % idt
  15. if __name__ == '__main__':
  16. print(check_id(sys.argv[0])) #python3 checkid.y abc@123

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

\r是回车不换行

  1. # @在一行#从头到尾移动
  2. import time
  3. length = 19
  4. count = 0
  5. while True:
  6. print('\r%s@%s' % ('#' * count,'#' * (length-count)),end='')
  7. try:
  8. time.sleep(0.3)
  9. except KeyboardInterrupt:
  10. print('\nBye-bye')
  11. break
  12. if count == length:
  13. count = 0
  14. count += 1

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

randpass模块参见《36-生成密码/验证码》(http://www.jianshu.com/p/b81b7ae19cb2)

  1. import subprocess
  2. import sys
  3. from randpass import gen_pass
  4. def adduser(username,password,fname):
  5. data = """user information:
  6. %s:%s
  7. """
  8. subprocess.call('useradd %s' % username,shell=True)
  9. subprocess.call(
  10. 'echo %s | passwd --stain %s' % (password,username),
  11. shell=True
  12. )
  13. with open(fname,'a') as fobj:
  14. fobj.write(data % (username,password))
  15. if __name__ == '__main__':
  16. username = sys.argv[1]
  17. password = gen_pass()
  18. adduser(username,password,'/etc/user.txt') #python3 adduser.y john

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

  1. stack = []
  2. def push_it():
  3. item = input('item to push:')
  4. stack.append(item)
  5. def pop_it():
  6. if stack:
  7. print("from stack popped %s" % stack.pop())
  8. def view_it():
  9. print(stack)
  10. def show_menu():
  11. cmds = {'0':push_it(),'1':pop_it(),'2':view_it()} #将函数存入字典
  12. promt = """(0)push it
  13. (1)pop it
  14. (2)view it
  15. (3)exit
  16. Please input your choice(0/1/2/3):"""
  17. while True:
  18. #input()得到字符串,用strip()去掉两端空白,再取下标为0的字符
  19. choice = input(promt).strip()[0]
  20. if choice not in '0123':
  21. print('Invaild input. Try again.')
  22. continue
  23. if choice == '3':
  24. break
  25. cmds[choice]()
  26. if __name__ == '__main__':
  27. show_menu()

48-实现Linux系统中unix2dos功能

  1. import sys
  2. def unix2dos(fname):
  3. dst_fname =fname + '.txt'
  4. with open(fname) as src_fobj:
  5. with open(dst_fname,'w') as dst_fobj:
  6. for line in src_fobj:
  7. line = line.rstrip() + '\r\n'
  8. dst_fobj.write(line)
  9. if __name__ == '__main__':
  10. unix2dos(sys.argv[1])

49-字典基础用法

  1. adict = dict() #{}
  2. dict(['ab','cd'])
  3. bdict = dict([('name','bob'),('age',25)])
  4. {}.fromkeys(['zhangsan','lisi','wangwu'],11)
  5. for key in bdict:
  6. print('%s:%s' % (key,bdict[key])) #name:bob age:25
  7. print("%(name)s:%(age)s" % bdict) #bob:25
  8. bdict['name'] = 'tom'
  9. bdict['email'] = 'tom@tedu.cn'
  10. print(bdict) #{'name': 'tom', 'age': 25, 'email': 'tom@tedu.cn'}
  11. del bdict['email']
  12. print(bdict) #{'name': 'tom', 'age': 25}
  13. bdict.pop('age')
  14. print(bdict) #{'name': 'tom'}
  15. bdict.clear()
  16. print(bdict) #{}

50-字典常用方法

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

51-集合常用方法

  1. #集合相当于无值的字典,所以用{}表示
  2. myset = set('hello')
  3. print(len(myset)) #4
  4. for ch in myset:
  5. print(ch)
  6. aset = set('abc')
  7. bset = set('cde')
  8. print(aset & bset) #交集 #{'c'}
  9. print(aset.intersection(bset)) #交集 #{'c'}
  10. print(aset | bset) #并集 #{'c', 'd', 'a', 'b', 'e'}
  11. print(aset.union(bset)) #并集 #{'c', 'd', 'a', 'b', 'e'}
  12. print(aset - bset) #差补 #{'b', 'a'}
  13. print(aset.difference(bset)) #差补 #{'b', 'a'}
  14. print(bset.difference(aset)) #差补 #{'e', 'd'}
  15. print(aset) #{'c', 'b', 'a'}
  16. aset.add('new') #添加
  17. print(aset) #{'new', 'c', 'b', 'a'}
  18. aset.update(['aaa','bbb']) #更新
  19. print(aset) #{'aaa', 'bbb', 'c', 'new', 'b', 'a'}
  20. aset.remove('bbb') #删除
  21. print(aset) #'aaa', 'c', 'new', 'b', 'a'}
  22. cset =set('abcde')
  23. dset = set('bcd')
  24. print(cset.issuperset(dset)) #cset是dset的超集吗? #True
  25. print(cset.issubset(dset)) #cset是dset的子集吗? #False

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

  1. #cp /etc/passwd .
  2. #cp /etc/passwd mima
  3. #vim mima ->修改,与passwd有些区别
  4. with open('passwd') as fobj:
  5. aset = set(fobj)
  6. with open('mima') as fobj:
  7. bset = set(fobj)
  8. with open('diff.txt','w') as fobj:
  9. fobj.writelines(bset - aset)

53-字典练习:模拟注册/登录

  1. import getpass
  2. userdb = {}
  3. def regirster():
  4. username = input('username:')
  5. if username in userdb:
  6. print('%s already exists.' % username)
  7. else:
  8. password = input('password:')
  9. userdb[username] = password
  10. def login():
  11. username = input('username:')
  12. password = getpass.getpass("password:")
  13. if userdb.get(username) != password:
  14. print('login failed')
  15. else:
  16. print('login successful')
  17. def show_menu():
  18. cmds = {'0':regirster,'1':login}
  19. prompt = '''(0)register
  20. (1)login
  21. (2)exit
  22. please input your choice(0/1/2):'''
  23. while True:
  24. choice = input(prompt).strip()[0]
  25. if choice not in '012':
  26. print('Invaild input,try again')
  27. continue
  28. if choice == '2':
  29. break
  30. cmds[choice]()
  31. if __name__ == '__main__':
  32. show_menu()

54.计算千万次加法运算时间

  1. import time
  2. result = 0
  3. start = time.time() #返回运算前时间戳
  4. for i in range(10000000):
  5. result += i
  6. end = time.time() #返回运算后时间戳
  7. print(result)
  8. print(end - start)

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

  1. import time
  2. t = time.localtime() #返回当前时间的九元组
  3. print(t) #time.struct_time(tm_year=2019, tm_mon=10, tm_mday=18, tm_hour=9, tm_min=8, tm_sec=21, tm_wday=4, tm_yday=291, tm_isdst=0)
  4. print(time.gmtime()) #返回格林威治0时区当前时间的九元组 #time.struct_time(tm_year=2019, tm_mon=10, tm_mday=18, tm_hour=1, tm_min=10, tm_sec=29, tm_wday=4, tm_yday=291, tm_isdst=0)
  5. print(time.time()) #常用,与1970-1-1 8:00之间的秒数,时间戳 #1571361029.5783381
  6. print(time.mktime(t)) #把九元组时间转换成时间戳 #1571361029.0
  7. time.sleep(1) #休眠1秒
  8. print(time.asctime()) #如果有参数,是九元组形式 #Fri Oct 18 09:10:30 2019
  9. print(time.ctime()) #返回当前时间,参数是时间戳,常用 #Fri Oct 18 09:10:30 2019
  10. print(time.strftime("%Y-%m-%d")) #常用 #2019-10-18
  11. print(time.strptime('2018-07-20',"%Y-%m-%d")) #返回九元组时间格式 #time.struct_time(tm_year=2018, tm_mon=7, tm_mday=20, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=201, tm_isdst=-1)
  12. print(time.strftime('%H:%M:%S')) #09:10:30
  13. ####################################################
  14. from datetime import datetime
  15. from datetime import timedelta
  16. print(datetime.today()) #返回当前时间的datetime对象 #2019-10-18 09:18:57.156086
  17. print(datetime.now()) #同上,可以用时区做参数 #2019-10-18 09:18:57.156086
  18. print(datetime.strptime('2018/07/20',"%Y/%m/%d")) #返回datetime对象 #2018-07-20 00:00:00
  19. dt = datetime.today()
  20. print(dt) #2019-10-18 09:21:36.056204
  21. print(datetime.ctime(dt)) #Fri Oct 18 09:21:36 2019
  22. print(datetime.strftime(dt,"%Y/%m/%d")) #2019/10/18
  23. days = timedelta(days=90,hours=3) #常用
  24. dt2 = dt + days
  25. print(dt2.year) #2020
  26. print(dt2.month) #1
  27. print(dt2.day) #16
  28. print(dt2.hour) #12

56-变量作用域

  1. x = 10 #全局变量从定义开始到程序结束,一直可见可变
  2. def foo():
  3. print(x)
  4. foo() #->10
  5. def bar():
  6. x = 20 #此处的x是局部变量,将全局变量遮盖住,不会影响全局变量的值
  7. print(x)
  8. bar() #x ->20
  9. print(x) #x ->10
  10. def aaa():
  11. global x #在局部引用全局变量
  12. x = 100 #将全局变量x重新赋值为100
  13. print(x)
  14. aaa()#x ->100
  15. print(x) #x ->100

57-os模块常用方法

  1. import os
  2. print(os.getcwd()) #显示当前路径 #/home/tarena/自习/2019.06.12
  3. print(os.listdir('/home/tarena/自习')) #ls -a 必须加路径 #['.idea', '2019.06.12', '读书方法.py']
  4. # os.mkdir('/tmp/mydemo') #mkdir /tmp/mydemo
  5. # os.chdir('/tmp/mydemo') #cd /tmp/mydemo
  6. # os.mknod('test.txt') #touch test.txt
  7. # os.symlink('/etc/hosts','zhuji') #ln -s /etc/hosts zhuji
  8. print(os.path.isdir('/etc')) #True
  9. print(os.path.isfile('test.txt')) #判断test.txt是不是文件 #False
  10. print(os.path.islink('zhuji')) #判断zhuji是不是软连接 #False
  11. print(os.path.exists('/tmp')) #判断是否存在 #True
  12. print(os.path.basename('/tmp/abc/aaa.txt')) #aaa.txt
  13. print(os.path.dirname('/tmp/abc/aaa.txt')) #/tmp/abc
  14. print(os.path.split('/tmp/abc/aaa.txt')) #('/tmp/abc', 'aaa.txt')
  15. print(os.path.join('/home/tom','xyz.txt')) #/home/tom/xyz.txt
  16. print(os.path.abspath('test.txt')) #返回当前目录test.txt的绝对路径 #/home/tarena/自习/2019.06.12/test.txt

58-pickle存储器

  1. import pickle
  2. """以前的文件写入,只能写入字符串,
  3. 如果希望把任意数据对象(数字,列表等)写入文件,取出来的时候数据类型不变,就用到pickle了
  4. """
  5. # shop_list = ['eggs','apple','peach']
  6. # with open('/tmp/shop.data','wb') as fobj:
  7. # pickle.dump(shop_list,fobj)
  8. with open('/tmp/shop.data','rb') as fobj:
  9. mylist = pickle.load(fobj)
  10. print(mylist[0],mylist[1],mylist[2])

59-异常处理基础

  1. try: #把有可能发生异常的语句放到try里执行
  2. n = int(input("number:"))
  3. result = 100/n
  4. print(result)
  5. except ValueError:
  6. print("invaild number")
  7. except ZeroDivisionError:
  8. print('0 not allowed')
  9. except KeyboardInterrupt:
  10. print('bye-bye')
  11. except EOFError:
  12. print('bye-bye')

60-异常处理完整语法

  1. try: #把有可能发生异常的语句放到try里执行
  2. n = int(input("number:"))
  3. result = 100/n
  4. except (ValueError,ZeroDivisionError):
  5. print("invaild number")
  6. except (KeyboardInterrupt,EOFError):
  7. print('bye-bye')
  8. else:
  9. print(result) #异常不发生时才执行else语句
  10. finally:
  11. print('Done') #不管异常是否发生都必须执行的语句
  12. #常用形式有try-except和try-finally

61-自定义异常

  1. def set_age(name,age):
  2. if not 0 < age <120:
  3. raise ValueError('年龄超出范围') #自主决定触发什么样的异常
  4. print("%s is %d years old" % (name,age))
  5. def set_age2(name,age):
  6. assert 0 < age <120,'年龄超出范围' #断言异常
  7. print("%s is %d years old" % (name, age))
  8. if __name__ == '__main__':
  9. set_age('zhangsan',20)
  10. set_age2('lisi',200)

62-函数调用:参数使用注意事项

  1. def get_age(name,age):
  2. print("%s is %s years old" % (name,age))
  3. get_age('bob',25) #参数按顺序传递
  4. get_age(25,'bob') #没有语法错误,但语义不对
  5. get_age(age=25,name='bob') #
  6. get_age('bob',age=25)
  7. # get_age() #错误,缺少参数
  8. # get_age('bob',25,100) #错误,多参数
  9. # get_age(age=25,'bob') #语法错误
  10. # get_age(25,name='bob') #错误,参数按顺序传递,name得到多个值

63-参数个数不固定的函数

  1. def fun1(*args): #*表示args是个元组
  2. print(args)
  3. def fun2(**kwargs): #**表示kwargs是个字典
  4. print(kwargs)
  5. def fun3(x,y):
  6. print(x * y)
  7. def fun4(name,age):
  8. print("%s is %s years old" % (name, age))
  9. if __name__ == '__main__':
  10. fun1() #()
  11. fun1(10) #(10,)
  12. fun1(10,'bob') #(10, 'bob')
  13. fun2() #{}
  14. fun2(name='bob',age=25) #{'name': 'bob', 'age': 25}
  15. fun3(*[10,5]) #调用的时候,*表示拆开后面的数据类型 #50
  16. fun4(**{'name':'bob','age':25}) # bob is 25 years old

64-偏函数基础应用

偏函数可以理解为,将现有函数的某些参数固定下来,构成一个新的函数。新函数调用就不用写那么多参数了

  1. from functools import partial
  2. def foo(a,b,c,d,f):
  3. return a + b + c + d + f
  4. if __name__ == '__main__':
  5. print(foo(10,20,30,40,5)) #105
  6. print(foo(10,20,30,40,25)) #125
  7. add = partial(foo,a =10,b = 20,c = 30,d = 40)
  8. print(add(f = 5)) #相当于foo(10,20,30,40,5) #105
  9. print(add(f=8)) #相当于foo(10,20,30,40,5) #108

65-偏函数应用:简单的图形窗口

  1. import tkinter
  2. from functools import partial
  3. root = tkinter.Tk()
  4. lb = tkinter.Label(text="Hello world!")
  5. b1 = tkinter.Button(root,fg = 'white',bg = 'blue',text='Button 1') #不使用偏函数生成按钮
  6. MyBtn = partial(tkinter.Button,root,fg = 'white',bg = 'blue') #使用偏函数定义MyBtn
  7. b2 = MyBtn(text = 'Button 2')
  8. b3 = MyBtn(text = quit,command = root.quit)
  9. lb.pack()
  10. b1.pack()
  11. b2.pack()
  12. b3.pack()
  13. root.mainloop()

66-生成器基础

生成器也是函数,只是常规函数通过return返回一个值,而生成器可以通过yield返回很多中间结果

  1. def mygen():
  2. yield 'hello'
  3. a = 10 + 20
  4. yield a
  5. yield [1,2,3]
  6. if __name__ == '__main__':
  7. m = mygen()
  8. for i in m:
  9. print(i)
  10. for i in m:
  11. print(i) #无值,因为生成器只能用一次

67-生成器实例:每次取出文件的10行内容

  1. def blocks(fobj):
  2. block = []
  3. counter = 0
  4. for line in fobj:
  5. block.append(line)
  6. counter += 1
  7. if counter == 10:
  8. yield block #返回中间结果,下次取值,从这里继续向下执行
  9. block = []
  10. counter = 0
  11. if block: #文件不够10行的部分
  12. yield block
  13. if __name__ == '__main__':
  14. fobj = open('/tmp/passwd') # cp /tmp/passwd /tmp
  15. for lines in blocks(fobj):
  16. print(lines)
  17. print()
  18. fobj.close()

68-匿名函数和filter

  1. from random import randint
  2. def fun1(x):
  3. return x % 2
  4. if __name__ == '__main__':
  5. alist = [randint(1,100) for i in range(10)]
  6. print(alist)
  7. # filter要求第一个参数是函数,该函数必须返回True或False
  8. # 执行时把alist的每一项作为fun1的参数,返回真留下,否则过滤掉
  9. # filter函数的参数又是函数,称作高阶函数
  10. result = filter(fun1,alist) #不使用匿名函数
  11. print(list(result))
  12. result2 = filter(lambda x:x % 2,alist)
  13. print(list(result2))

69-匿名函数和map

  1. from random import randint
  2. def fun(x):
  3. return x * 2 + 1
  4. if __name__ == '__main__':
  5. alist = [randint(1,100) for i in range(10)]
  6. print(alist)
  7. # map将第二个参数中的每一项交给fun函数进行加工,保留加工后的结果
  8. result = map(fun,alist) #使用常规函数作为参数
  9. print(list(result))
  10. result2 = map(lambda x:x * 2 + 1,alist) #使用匿名函数作为参数
  11. print(list(result2))

70-函数练习:数字游戏

随机生成100以内的两个数字,实现随机的加减法。如果是减法,结果不能是负数。算错三次,给出正确答案。

  1. from random import randint,choice
  2. def add(x,y):
  3. return x + y
  4. def sub(x,y):
  5. return x - y
  6. def exam():
  7. cmds = {'+':add,'-':sub}
  8. nums = [randint(1,100) for i in range(2)]
  9. nums.sort(reverse=True) #列表降序排列
  10. op = choice('+-')
  11. result = cmds[op](*nums)
  12. prompt = "%s %s %s = " % (nums[0],op,nums[1])
  13. tries = 0
  14. while tries < 3:
  15. try:
  16. answer = int(input(prompt))
  17. except: #简单粗暴的捕获所有异常
  18. continue
  19. if answer == result:
  20. print('Very good!')
  21. break
  22. else:
  23. print('Wrong answer')
  24. tries += 1
  25. else: #此处是while的else,全算错才给答案,算对了就不用给出答案了
  26. print('%s%s' % (prompt,result))
  27. if __name__ == '__main__':
  28. while True:
  29. exam()
  30. try:
  31. yn = input("(Continue(y/n)?").strip()[0]
  32. except IndexError:
  33. continue
  34. except (KeyboardInterrupt,EOFError):
  35. print()
  36. yn = 'n'
  37. if yn in 'nN':
  38. break

71-数字游戏进阶

与前面例子相同,只是加减法函数更换为匿名函数

  1. from random import randint,choice
  2. def exam():
  3. cmds = {'+':lambda x,y:x + y,'-':lambda x,y:x - y}
  4. nums = [randint(1,100) for i in range(2)]
  5. nums.sort(reverse=True) #列表降序排列
  6. op = choice('+-')
  7. result = cmds[op](*nums)
  8. prompt = "%s %s %s = " % (nums[0],op,nums[1])
  9. tries = 0
  10. while tries < 3:
  11. try:
  12. answer = int(input(prompt))
  13. except: #简单粗暴的捕获所有异常
  14. continue
  15. if answer == result:
  16. print('Very good!')
  17. break
  18. else:
  19. print('Wrong answer')
  20. tries += 1
  21. else: #此处是while的else,全算错才给答案,算对了就不用给出答案了
  22. print('%s%s' % (prompt,result))
  23. if __name__ == '__main__':
  24. while True:
  25. exam()
  26. try:
  27. yn = input("(Continue(y/n)?").strip()[0]
  28. except IndexError:
  29. continue
  30. except (KeyboardInterrupt,EOFError):
  31. print()
  32. yn = 'n'
  33. if yn in 'nN':
  34. break

72-递归函数计算阶乘

递归函数就是在函数内部调用自己

  1. def fun(n): #5
  2. if n == 1:
  3. return n
  4. return n * fun(n - 1)
  5. #5 * fun(4)
  6. # 5 * 4 fun(3)
  7. # 5 * 4 *3fun(2)
  8. # 5 * 4 *3 * 2fun(1)
  9. # 5 * 4 *3 * 2 * 1
  10. if __name__ == '__main__':
  11. print(fun(5))
  12. print(fun(6))

73-函数递归练习:逐级列出目录

  1. # listdir.py
  2. import os
  3. import sys
  4. def list_files(path):
  5. if os.path.isdir(path):
  6. print(path + ':')
  7. content = os.listdir(path)
  8. print(content)
  9. for fname in content:
  10. fname = os.path.join(path,fname)
  11. list_files(fname)
  12. if __name__ == '__main__':
  13. list_files(sys.argv[1]) #python3 listdir.py /etc

74-函数递归练习:快速排序

思路:1、假设列表中的第一个数是中间值,逼他小的数字放到smaller列表中,比它大的数字放到larger列表中,再将这三项拼接起来

2、因为smaller和larger仍然是无序列表,需要使用相同的方法继续分割。

3、如果列表长度是0或1,那么就没有必要再排序了。

  1. from random import randint
  2. def quick_sort(num_list):
  3. if len(num_list) < 2:
  4. return num_list
  5. middle = num_list[0]
  6. smaller = []
  7. larger = []
  8. for i in num_list[1:]:
  9. if i < middle:
  10. smaller.append(i)
  11. else:
  12. larger.append(i)
  13. return quick_sort(smaller) + [middle] + quick_sort(larger)
  14. if __name__ == '__main__':
  15. alist = [randint(1,100) for i in range(10)]
  16. print(alist) #[33, 2, 30, 91, 45, 61, 22, 26, 71, 47]
  17. print(quick_sort(alist)) #[2, 22, 26, 30, 33, 45, 47, 61, 71, 91]

75-闭包的用法

下面的代码用到了[《65-偏函数应用:简单的图形窗口》]图形窗口上的按钮有个command选项,其实它就是一个函数。如下:

  1. import tkinter
  2. from functools import partial
  3. root = tkinter.Tk()
  4. lb = tkinter.Label(text="Hello world!")
  5. b1 = tkinter.Button(root,fg = 'white',bg = 'blue',text='Button 1') #不使用偏函数生成按钮
  6. MyBtn = partial(tkinter.Button,root,fg = 'white',bg = 'blue') #使用偏函数定义MyBtn
  7. b2 = MyBtn(text = 'Button 2')
  8. b3 = MyBtn(text = quit,command = root.quit)
  9. lb.pack()
  10. b1.pack()
  11. b2.pack()
  12. b3.pack()
  13. root.mainloop()

按下Button 1和Button 2就会执行hello和welcome两个函数。这两个函数非常类似,如果有10个按钮,并且都是类似的呢?换成内部函数、闭包的语法如下:

  1. import tkinter
  2. from functools import partial
  3. def hello(word):
  4. def welcome():
  5. lb.config(text="Hello %s!" % word)
  6. return welcome #hello函数的返回值还是函数
  7. root = tkinter.Tk()
  8. lb = tkinter.Label(text="Hello world!",font="Times 26")
  9. MyBtn = partial(tkinter.Button,root,fg = 'white',bg = 'blue') #使用偏函数定义MyBtn
  10. b1 = MyBtn(text = 'Button 1',command=hello('China'))
  11. b2 = MyBtn(text = 'Button 2',command=hello('world'))
  12. b3 = MyBtn(text = quit,command = root.quit)
  13. lb.pack()
  14. b1.pack()
  15. b2.pack()
  16. b3.pack()
  17. root.mainloop()

76-装饰器基础

  1. def color(func):
  2. def red():
  3. return '\033[31;1m%s\033[0m' % func()
  4. return red
  5. def hello():
  6. return 'Hello world!'
  7. @color
  8. def welcome():
  9. return 'Hello China!'
  10. if __name__ == '__main__':
  11. hello = color(hello) #此种写法可以换成为welcome加上@color的写法
  12. print(hello())
  13. print(welcome()) #welcome因为有装饰器,所以调用时不是调用welcome函数,
  14. # 而是相当于color(welcome)()
  15. #color(welcome)返回red,color(welcome)()等价于red()

77-带有参数的装饰器

  1. def color(func):
  2. def red(*args):
  3. return '\033[31;1m%s\033[0m' % func(*args)
  4. return red
  5. @color
  6. def hello(word):
  7. return 'Hello %s!' % word
  8. @color
  9. def welcome():
  10. return 'How are you?'
  11. if __name__ == '__main__':
  12. print(hello('China'))
  13. print(welcome())

78-装饰器,返回不同颜色的字体

  1. def colors(c):
  2. def set_color(func):
  3. def red(*word):
  4. return '\033[31;1m%s\033[0m' % func(*word)
  5. def green(*word):
  6. return '\033[32;1m%s\033[0m' % func(*word)
  7. adict = {'red':red,'green':green}
  8. return adict[c]
  9. return set_color
  10. @colors('red')
  11. def hello():
  12. return 'Hello world!'
  13. @colors('green')
  14. def welcome(word):
  15. return 'Hoello %s' % word
  16. if __name__ == '__main__':
  17. print(hello())
  18. print(welcome('China'))

79-综合练习:记账小程序

1、记账时手头有一万块钱
2、可以记录花的钱、存的钱,以及收支明细

  1. import pickle
  2. import os
  3. import time
  4. def cost(wallet,record): #记录花钱的函数
  5. amount = int(input('amount:'))
  6. comment = input('comment:')
  7. date = time.strftime('%Y-%m-%d')
  8. with open(wallet,'rb') as fobj:
  9. balance = pickle.load(fobj) - amount
  10. with open(wallet,'wb') as fobj:
  11. pickle.dump(balance,fobj)
  12. with open(record, 'a') as fobj:
  13. fobj.write('%-12s%-8s%-8s%-10s%-20s\n' % (date,amount,'',balance,comment))
  14. def save(wallet,record): #记录存钱的函数
  15. amount = int(input('amount:'))
  16. comment = input('comment:')
  17. date = time.strftime('%Y-%m-%d')
  18. with open(wallet, 'rb') as fobj:
  19. balance = pickle.load(fobj) + amount
  20. with open(wallet, 'wb') as fobj:
  21. pickle.dump(balance, fobj)
  22. with open(record, 'a') as fobj:
  23. fobj.write('%-12s%-8s%-8s%-10s%-20s\n' % (date, '', amount, balance, comment))
  24. def query(wallet,record): #查询收支明细的函数
  25. print('%-12s%-8s%-8s%-10s%-20s\n' % ('date', 'cost', 'save', 'balance', 'comment'))
  26. with open(record) as fobj:
  27. for line in fobj:
  28. print(line,end='')
  29. with open(wallet,'rb') as fobj:
  30. balance = pickle.load(fobj)
  31. print("Latest Balance:%d" % balance)
  32. def show_menu():
  33. cmds = {'0':cost,'1':save,'2':query}
  34. prompt ="""(0)cost
  35. (1)save
  36. (2)query
  37. (3)exit
  38. please input your choice(0/1/2/3):"""
  39. wallet = 'wallet data'
  40. record = 'record.txt'
  41. if not os.path.exists(wallet):
  42. with open(wallet, 'wb') as fobj:
  43. pickle.dump(10000, fobj)
  44. while True:
  45. try:
  46. choice = input(prompt).strip()[0]
  47. except IndexError:
  48. continue
  49. except (KeyboardInterrupt,EOFError):
  50. print()
  51. choice = '3'
  52. if choice not in '0123':
  53. print('Invaild input.try again')
  54. continue
  55. if choice == '3':
  56. break
  57. cmds[choice](wallet,record)
  58. if __name__ == '__main__':
  59. show_menu()

80-hashlib模块之计算md5值

  1. #check_md5.py
  2. import hashlib
  3. import sys
  4. def check_md5(fname):
  5. m = hashlib.md5()
  6. with open(fname,'rb') as fobj:
  7. while True:
  8. data = fobj.read(4096)
  9. if not data:
  10. break
  11. m.update(data)
  12. return m.hexdigest()
  13. if __name__ == '__main__':
  14. print(check_md5(sys.argv[1])) #python3 check-md5.py /etc/passwd

81-tarfile模块的基础应用

  1. import tarfile
  2. #压缩文件的方法
  3. tar = tarfile.open('/tmp/demo.tar.gz','w:gz') #gzip压缩
  4. tar.add('/etc/hosts')
  5. tar.add('/etc/security')
  6. tar.close()
  7. #tar tvzf /tmp/demo.tar.gz
  8. #解压文件的方法
  9. tar = tarfile.open('/tmp/demo.tar.gz','r:gz')
  10. tar.extractall() #解压所有文件到当前目录
  11. tar.close()

82-OOP基础

为玩具厂创建一个玩具熊类。玩具熊有名字、尺寸、颜色这些数据属性;还有唱歌、说话的行为。

  1. class BearToy:
  2. def __init__(self,nm,color,size):
  3. """__init__在实例化时自动执行,实例本身自动作为第一个参数传递给self,
  4. self只是习惯使用的名字,不是必须使用
  5. :param nm: 名字
  6. :param color:颜色
  7. :param size: 尺寸
  8. """
  9. self.name = nm
  10. self.color = color #绑定属性到实例
  11. self.size = size
  12. def sing(self):
  13. print('lalala...')
  14. def speak(self):
  15. print('My name is %s' % self.name)
  16. if __name__ == '__main__':
  17. tidy = BearToy('Tidy','White','Large') #调用__init__
  18. print(tidy.color) #White
  19. print(tidy.size) #Large
  20. tidy.sing() #lalala...
  21. tidy.speak() #My name is Tidy

83-OOP之组合

如果两个类有本质不同,其中一个类的对象是另一个类对象的组件时,使用组和是最佳方案。

玩具熊还有生产厂商的信息,生产厂商的信息可以作为玩具熊的一个属性。

  1. class Vendor:
  2. def __init__(self,phone,email):
  3. self.phone = phone
  4. self.email = email
  5. def call(self):
  6. print('calling %s' % self.phone)
  7. class BearToy:
  8. def __init__(self,color,size,phone,email):
  9. self.color = color #绑定属性到实例
  10. self.size = size
  11. self.vendor = Vendor(phone,email)
  12. if __name__ == '__main__':
  13. bigbear = BearToy('Brown','Middle','400-111-8989','sales@tedu.cn')
  14. print(bigbear.color) #Brown
  15. bigbear.vendor.call() #calling 400-111-8989

84-OOP之继承

如果两个类有很多相同之处,使用继承更为合理。

新玩具熊增加了一个跑的行为,其他与原来玩具熊一致。

  1. class BearToy:
  2. def __init__(self,nm,color,size):
  3. self.name = nm
  4. self.color = color #绑定属性到实例
  5. self.size = size
  6. def sing(self):
  7. print('lalala...')
  8. def speak(self):
  9. print('My name is %s' % self.name)
  10. class NewBear(BearToy):
  11. def run(self):
  12. print('running...')
  13. if __name__ == '__main__':
  14. b1 = NewBear('Venie','Beown','Small')
  15. b1.sing()
  16. b1.run()

85-OOP之子类调用父类方法

如果子类和父类具有同名的方法,那么父类方法将被遮盖住.

可以在子类中明确指明调用的是父类方法,而不是子类的同名方法.

  1. class BearToy:
  2. def __init__(self,nm,color,size):
  3. self.name = nm
  4. self.color = color #绑定属性到实例
  5. self.size = size
  6. def sing(self):
  7. print('lalala...')
  8. def speak(self):
  9. print('My name is %s' % self.name)
  10. class NewBear(BearToy):
  11. def __init__(self,nm,color,size,date):
  12. # BearToy.__init__(self,nm,color,size) #以下写法完全一样,更推荐下面写法
  13. super(NewBear,self).__init__(nm,color,size)
  14. self.date = date #新品玩具熊增加玩具熊的生产日期
  15. def run(self):
  16. print('running...')
  17. if __name__ == '__main__':
  18. b1 = NewBear('Venie','Beown','Small','2018-07-20')
  19. b1.sing()
  20. b1.run()

86-OOP之必须掌握的magic

  1. class Book:
  2. def __init__(self,title,author,pages):
  3. self.title = title
  4. self.author = author
  5. self.pages = pages
  6. def __str__(self):
  7. return '《%s》' % self.title
  8. def __call__(self):
  9. print('《%s》is written by %s' % (self.title,self.author))
  10. if __name__ == '__main__':
  11. py_book = Book('Core Python','Wesley',800) #调用__init__()方法
  12. print(py_book) #调用__str__()方法
  13. py_book() #调用__call__()方法

87-OOP之多重继承

类的父类(基类)可以有多个,子类可以调用所有父类的方法

如果用重名方法,生效的顺序是自下而上,自左而右。当然最好不要出现重名方法。

  1. class A:
  2. def foo(self):
  3. print('in A foo')
  4. def hello(self):
  5. print('A hello')
  6. class B:
  7. def bar(self):
  8. print('in B foo')
  9. def hello(self):
  10. print('B hello')
  11. class C(B,A):
  12. pass
  13. # def hello(self):
  14. # print('C hello')
  15. if __name__ == '__main__':
  16. c = C() #空
  17. c.foo() #in A foo
  18. c.bar() #in B foo
  19. c.hello() #B hello

88-OOP之类方法和静态方法

通过Date创建实例,也可以通过Date.create创建实例

  1. class Date:
  2. def __init__(self,year,month,date):
  3. self.year = year
  4. self.month = month
  5. self.date =date
  6. @classmethod #类方法,不用创建实例即可调用
  7. def create(cls,dstr): #cls表示类本身,class的缩写
  8. y,m,d =map(int,dstr.split('-')) #map(int,['2000','5','4'])
  9. dt = cls(y,m,d) #即Date(y,m,d)
  10. return dt
  11. @staticmethod #静态方法,写在类的外面,可以独立成为一个函数,“愣”把它放在类中了
  12. def is_date_vaild(dstr):
  13. y,m,d = map(int,dstr.split('-'))
  14. return 1 <= d <= 31 and 1 <=m <= 12 and y< 4000
  15. if __name__ == '__main__':
  16. bith_date = Date(1995,12,3)
  17. print(Date.is_date_vaild('2000-5-4')) #True
  18. day = Date.create('2000-5-4')
  19. print(day) #<__main__.Date object at 0x7fb1fbc5cd68>

89-综合练习:备份程序

1、既要可以实现完全备份,又要实现增量备份

2、完全备份时,将目录打个tar包,计算每个文件的md5值

3、增量备份时,备份有变化的文件和新增加的文件,更新md5值

  1. import time
  2. import os
  3. import tarfile
  4. import hashlib
  5. import pickle
  6. def check_md5(fname):
  7. m = hashlib.md5()
  8. with open(fname,'rb') as fobj:
  9. while True:
  10. data = fobj.read(4096)
  11. if not data:
  12. break
  13. m.update(data)
  14. return m.hexdigest()
  15. def full_backup(src_dir,dst_dir,md5file):
  16. fname = os.path.basename(src_dir.rstrip('/'))
  17. fname = '%s_full_%s.tar.gz' % (fname,time.strftime('%Y%m%d'))
  18. fname = os.path.join(dst_dir,fname)
  19. md5dict = {}
  20. tar = tarfile.open(fname,'w:gz')
  21. tar.add(src_dir)
  22. tar.close()
  23. for path,folders, files in os.walk(src_dir):
  24. for each_file in files:
  25. key = os.path.join(path,each_file)
  26. md5dict[key] = check_md5(key)
  27. with open(md5file,'wb') as fobj:
  28. pickle.dump(md5dict,fobj)
  29. def incr_backup(src_dir,dst_dir,md5file):
  30. fname = os.path.basename(src_dir.rstrip('/'))
  31. fname = '%s_incr_%s.tar.gz' % (fname, time.strftime('%Y%m%d'))
  32. fname = os.path.join(dst_dir, fname)
  33. md5dict = {}
  34. with open(md5file,'rb') as fobj:
  35. oldmd5 = pickle.load(fobj)
  36. for path,folders,files in os.walk(src_dir):
  37. for each_file in files:
  38. key = os.path.join(path,each_file)
  39. md5dict[key] = check_md5(key)
  40. with open(md5file,'wb') as fobj:
  41. pickle.dump(md5dict,fobj)
  42. tar = tarfile.open(fname, 'w:gz')
  43. for key in md5dict:
  44. if oldmd5.get(key) != md5dict[key]:
  45. tar.add(key)
  46. tar.close()
  47. if __name__ == '__main__':
  48. # mkdir /tmp/demo; cp -r /etc/security /tmp/demo
  49. src_dir = '/tmp/demo/security'
  50. dst_dir = '/var/tmp/backup' #mkdir /var/tmp/backup
  51. md5file = '/var/tmp/backup/md5.data'
  52. if time.strftime('%a') == 'Mon':
  53. full_backup(src_dir,dst_dir,md5file)
  54. else:
  55. incr_backup(src_dir,dst_dir,md5file)

90-OOP练习:实现unix2dos和dos2unix功能

windows文本行结束标志是\r\n,非windows是\n.

  1. import os
  2. class Convert:
  3. def __init__(self,fname):
  4. self.fname = fname
  5. def to_linux(self):
  6. dst_fname = os.path.splitext(self.fname)[0] + '.linux'
  7. with open(self.fname,'r') as src_fobj:
  8. with open(dst_fname,'w') as dst_fobj:
  9. for line in src_fobj:
  10. line = line.rstrip() + '\n'
  11. dst_fobj.write(line)
  12. def to_windows(self):
  13. dst_fname = os.path.splitext(self.fname)[0] + '.windows'
  14. with open(self.fname,'r') as src_fobj:
  15. with open(dst_fname,'w') as dst_fobj:
  16. for line in src_fobj:
  17. line = line.rstrip() + '\r\n'
  18. dst_fobj.write(line)
  19. if __name__ == '__main__':
  20. c = Convert('/tmp/passwd') # cp /etc/passwd /tmp
  21. c.to_linux()
  22. c.to_windows()

91-re模块基础语法

  1. import re
  2. m = re.match('f..','food') #匹配到返回对象
  3. print(re.match('f..','seafood')) #匹配不到返回None
  4. m.group() #返回匹配的值
  5. m = re.search('f..','seafood')
  6. m.group()
  7. re.findall('f..','seafood is food') #返回所有匹配项组成的列表
  8. result = re.finditer('f..','seafood is food') #返回匹配对象组成的迭代器
  9. for m in result: #迭代器中逐个取出匹配对象
  10. print(m.group())
  11. re.sub('f..','abc','fish is food')
  12. re.split('\.|-','hello-world.tar.gz') #用.和-做切割符号
  13. patt = re.compile('f..') #先把要匹配的模式编译,提升效率
  14. m = patt.search('seafood') #指定在哪个字符串中匹配
  15. m.group()

92-re练习:匹配文件中指定模式

  1. import re
  2. def count_patt(fname,patt):
  3. cpatt = re.compile(patt)
  4. result = {}
  5. with open(fname) as fobj:
  6. for line in fobj:
  7. m = cpatt.search(line) #如果匹配不到,返回None
  8. if m:
  9. key = m.group()
  10. result[key] = result.get(key,0) + 1
  11. return result
  12. if __name__ == '__main__':
  13. fname = 'access_log' #apache日志文件
  14. ip = '^(\d+\.){3}\d+' #日志开头的ip地址
  15. print(count_patt(fname,ip))
  16. br = 'Firefox|MSIE|Chrome' #日志中客户端浏览器
  17. print(count_patt(fname,br))

93-re练习:模式匹配进阶写法

  1. import re
  2. from collections import Counter #Counter对象是有序的,字典无序
  3. class Countpatt:
  4. def __init__(self,fname):
  5. self.fname = fname
  6. def count_patt(self,patt):
  7. cpatt = re.compile(patt)
  8. result = Counter()
  9. with open(self.fname) as fobj:
  10. for line in fobj:
  11. m = cpatt.search(line) #如果匹配不到,返回None
  12. if m:
  13. result.update([m.group()])
  14. return result
  15. if __name__ == '__main__':
  16. c = Countpatt('access_log')
  17. ip = '^(\d+\.){3}\d+'
  18. br = 'Firefox|MSIE|Chrome'
  19. a = c.count_patt(ip)
  20. print(a)
  21. print(a.most_common(3)) #访问量最大的前三名
  22. print(c.count_patt(br))

94-socket基础:TCP服务器流程

服务器启动后,测试可以使用:talent 127.0.0.1 12345

  1. import socket
  2. host = '' #表示本机所有地址0.0.0.0
  3. port = 12345 #应该大于1024
  4. addr = (host,port)
  5. s = socket.socket() #默认值就是基于TCP的网络套接字
  6. #设置选项,程序结束之后可以立即再运行,否则要等60秒
  7. s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  8. s.bind(addr) #绑定地址到套接字
  9. s.listen(1) #启动侦听进程
  10. cli_sock,cli_addr = s.accept() #等待客户端链接
  11. print('Client connect from:',cli_addr)
  12. print(cli_sock.recv(2014)) #一次最多读1024字节数据
  13. cli_sock.send(b'I 4 C U\r\n') #发送的数据要求是byte类型
  14. cli_sock.close()
  15. s.close()

95-可重用的TCP服务器

在[94-socket基础:TCP服务器流程]中,TCP服务器只能一个客户端连接,客户端也只能发送一条消息。本例允许客户端发送多条消息,输入end结束。客户端退出后,服务器程序不在退出,可以为下一个客户端提供服务:

  1. import socket
  2. host = '' #表示本机所有地址0.0.0.0
  3. port = 12345 #应该大于1024
  4. addr = (host,port)
  5. s = socket.socket() #默认值就是基于TCP的网络套接字
  6. #设置选项,程序结束之后可以立即再运行,否则要等60秒
  7. s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  8. s.bind(addr) #绑定地址到套接字
  9. s.listen(1) #启动侦听进程
  10. while True:
  11. cli_sock,cli_addr = s.accept() #等待客户端链接
  12. print('Client connect from:',cli_addr)
  13. while True:
  14. data = cli_sock.recv(2014)
  15. if data.strip() == b'end':
  16. break
  17. print(data.decode('utf8')) #byte类型转换为stringleix
  18. data = input('> ') + '\r\n' #获得的是string类型
  19. cli_sock.send(data.encode('utf8')) #转成bytes类型发送
  20. cli_sock.close()
  21. s.close()

96-简单而完整的TCP服务器

客户端可以通过 talent 127.0.0.1 12345访问

没发送一段文字,将会收到加上当前时间的文字

  1. import socket
  2. from time import strftime
  3. class TcpTimeServer:
  4. def __init__(self,host='',port=12345):
  5. self.addr = (host,port)
  6. self.serv = socket.socket()
  7. self.serv.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  8. self.serv.bind(self.addr)
  9. self.serv.listen(1)
  10. def chat(self,c_sock):
  11. while True:
  12. data = c_sock.recv(1024)
  13. if data.strip() == b'quit':
  14. break
  15. data = '[%s] %s' % (strftime('%H:%M:%S'),data.decode('utf8'))
  16. c_sock.send(data.encode('utf8'))
  17. c_sock.close()
  18. def mainloop(self):
  19. while True:
  20. cli_sock,cli_addr = self.serv.accept()
  21. self.chat(cli_sock)
  22. self.serv.close()
  23. if __name__ == '__main__':
  24. s = TcpTimeServer()
  25. s.mainloop()

97-简单的TCP客户端

客户端链接服务器的12345端口,在单独的一行输入end结束客户端程序

  1. import socket
  2. host = '192.168.4.254' #服务器IP地址
  3. port = 12345 #服务器端口
  4. addr = (host,port)
  5. c = socket.socket()
  6. c.connect(addr)
  7. while True:
  8. data = input('> ') + '\r\n'
  9. c.send(data.encode('utf8')) #服务器收到end结束,所以要先发送再判断
  10. if data.strip() == 'end':
  11. break
  12. data = c.recv(1024)
  13. print(data.decode('utf8'))
  14. c.close()

98-简单的UDP服务器流程

UDP是面向非连接的,不用listen、不用accept

UDP不区分客户端,就算是同一个客户端发来的多个数据包,UDP服务器也不区分,与处理多个客户的发来的数据包等同对待。

  1. import socket
  2. from time import strftime
  3. host = ''
  4. port = 12345
  5. addr = (host,port)
  6. s = socket.socket(type=socket.SOCK_DGRAM)
  7. s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  8. s.bind(addr)
  9. while True:
  10. data ,cli_addr = s.recvfrom(1024)
  11. clock = strftime('%H:%M:%S')
  12. data = '[%s] %s' % (clock,data)
  13. s.sendto(data.encode('utf8'),cli_addr)
  14. s.close()

99-简单的UDP客户端流程

UDP客户端非常简单,只要发送到服务器地址就可以了。

  1. import socket
  2. host = '192.168.4.254' #服务器IP地址
  3. port = 12345 #服务器端口
  4. addr = (host,port)
  5. c = socket.socket(type=socket.SOCK_DGRAM)
  6. while True:
  7. data = input('> ')
  8. c.send(data.encode('utf8')) #服务器收到end结束,所以要先发送再判断
  9. if data.strip() == 'quit':
  10. break
  11. c.sendto(data.encode('utf8'),addr)
  12. print(c.recvfrom(1024)[0].decode('utf8'))
  13. #print(c.recvfrom(1024))
  14. c.close()

100-百鸡百钱问题

我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各多少?

思路:

1、答案不只一个

2、如果全是公鸡i,最多100/5只

3、如果全是母鸡j,最多100/3只

4、如果全是小鸡k,100块钱,可以买300只;但,所有鸡最多100只

5、鸡的数目i+j+k=100

6、鸡的价钱i * 5 + j * 3 + k / 3 ==100

  1. for i in range(100//5 + 1): #//表示只留商,不要小数,舍弃余数
  2. for j in range(100//3 + 1):
  3. for k in range(100):
  4. if i + j + k ==100 and i * 5 + j * 3 + k / 3 ==100:
  5. print('公鸡:%s,母鸡:%s,小鸡:%s' % (i,j,k))
  6. # 公鸡:0,母鸡:25,小鸡:75
  7. # 公鸡:4,母鸡:18,小鸡:78
  8. # 公鸡:8,母鸡:11,小鸡:81
  9. # 公鸡:12,母鸡:4,小鸡:84

101-多进程基础

fork()后会出现子进程,父子进程都打印Hello World!,所以会有两行相同的内容输出

  1. import os
  2. print('starting...')
  3. os.fork() #生成子进程,后续代码同时在父子进程中执行
  4. print('Hello World!')
  5. #可以根据fork()返回值判断是父进程,还是子进程
  6. import os
  7. print('starting...')
  8. pid = os.fork() #返回值是个数字,对于父进程,返回值是子进程PID,子进程是0
  9. if pid:
  10. print('In parent') #父进程执行的代码
  11. else:
  12. print('In child') #子进程执行的代码
  13. print('Done') #父子进程都会执行的代码
  14. #多进程编程时,要明确父子进程的工作。如:父进程只用于fork子进程;子进程做具体的工作。
  15. # 如果在循环体中,做完后要退出,否则子进程还会在产生子进程,孙进程...子子孙孙无穷匮也,系统奔溃。
  16. import os
  17. for i in range(5):
  18. pid = os.fork() #父进程的工作是生成子进程
  19. if not pid: #如果是子进程,工作完后,结束,不要进入循环
  20. print('hello')
  21. exit() #注释这一行执行,查看结果,分析原因

102-多进程的ping

没有多进程,ping一个网段IP地址往往要花费几十分钟;使用多进程,几分钟解决

  1. import subprocess
  2. import os
  3. def ping(host):
  4. rc = subprocess.call(
  5. 'ping -c2 %s &> /dev/null' % host,
  6. shell=True
  7. )
  8. if rc:
  9. print('%s:down' % host)
  10. else:
  11. print('%s:up' % host)
  12. if __name__ == '__main__':
  13. ips = ('192.168.1.%s' % i for i in range(1,255))
  14. for ip in ips:
  15. pid = os.fork()
  16. if not pid:
  17. ping(ip)
  18. exit()

103-多进程效率

没有多进程,即使CPU有多个核心,程序只是运行在一个核心上,无法利用多进程提升效率。5000万次加法,如果需要2.5秒,调用两次共花费5秒。

  1. import time
  2. def calc():
  3. result = 0
  4. for i in range(1,50000001):
  5. result += 1
  6. print(result)
  7. if __name__ == '__main__':
  8. start = time.time()
  9. calc()
  10. calc()
  11. end = time.time()
  12. print(end - start)
  13. #通过多进程,程序运行在多个核心上,同样的调用两次5000万次加法运算,时间仅为一半
  14. import time
  15. import os
  16. def calc():
  17. result = 0
  18. for i in range(1,50000001):
  19. result += 1
  20. print(result)
  21. if __name__ == '__main__':
  22. start = time.time()
  23. for i in range(2):
  24. pid = os.fork()
  25. if not pid:
  26. calc()
  27. exit()
  28. os.waitpid(-1,0) #挂起父进程,直到子进程结束才继续执行
  29. os.waitpid(-1,0) #每个waitpid只能处理一个僵尸进程,两个子进程需要调用两次
  30. end = time.time()
  31. print(end - start)

104-僵尸进程

多进程编程要注意僵尸进程。子进程没有可执行代码后将变成僵尸进程,如果父进程一直运行,有没有处理僵尸进程的代码,僵尸进程也将一直存在,消耗资源。僵尸进程无法通过kill命令杀掉。

  1. import os
  2. import time
  3. pid = os.fork()
  4. if pid:
  5. print('In parent.sleeping...')
  6. time.sleep(60)
  7. print('Parent done.')
  8. else:
  9. print('In child.sleeping...')
  10. time.sleep(10)
  11. print('Child done') #10秒后,子进程变成了僵尸进程
  12. # watch -n1 ps a 当子进程成为僵尸进程时,显示为z
  13. # kill试图杀死僵尸进程、父进程,查看结果

105–解决僵尸进程问题

os.waitpid()的第二个参数,0表示挂起父进程,1表示不挂起父进程.

  1. import os
  2. import time
  3. pid = os.fork()
  4. if pid:
  5. print('In parent.sleeping...')
  6. print(os.waitpid(-1,1)) #无僵尸进程可以处理,返回0
  7. time.sleep(20)
  8. print(os.waitpid(-1, 1)) #处理僵尸进程,返回子进程pid
  9. time.sleep(60)
  10. print('Parent done.')
  11. else:
  12. print('In child.sleeping...')
  13. time.sleep(10)
  14. print('Child done') #10秒后,子进程变成了僵尸进程
  15. # watch -n1 ps a 当子进程成为僵尸进程时,显示为z
  16. # kill试图杀死僵尸进程、父进程,查看结果

106-基于多进程的时间消息服务器

1、支持多客户端同时访问

2、客户端向服务器

3、每个客户端断开后产生僵尸进程,新客户端连接时销毁所有的僵尸进程

  1. import socket
  2. import os
  3. from time import strftime
  4. class TcpTimeServer:
  5. def __init__(self,host='',port=12345):
  6. self.addr = (host,port)
  7. self.serv = socket.socket()
  8. self.serv.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  9. self.serv.bind(self.addr)
  10. self.serv.listen(1)
  11. def chat(self,c_sock):
  12. while True:
  13. data = c_sock.recv(1024)
  14. if data.strip() == b'quit':
  15. break
  16. data = '[%s] %s' % (strftime('%H:%M:%S'),data.decode('utf8'))
  17. c_sock.send(data.encode('utf8'))
  18. c_sock.close()
  19. def mainloop(self):
  20. while True:
  21. cli_sock,cli_addr = self.serv.accept()
  22. pid = os.fork()
  23. if pid:
  24. cli_sock.close()
  25. while True:
  26. result = os.waitpid(-1,1)[0] #waitpid会优先处理僵尸进程
  27. if result == 0:
  28. break
  29. else:
  30. self.serv.close()
  31. self.chat(cli_sock)
  32. exit()
  33. self.serv.close()
  34. if __name__ == '__main__':
  35. s = TcpTimeServer()
  36. s.mainloop()

107-基于多线程的ping

多线程与多进程类似,但是每个线程没有自己的资源空间,它们共用进程的资源

多线程没有僵尸进程的问题

  1. import subprocess
  2. import threading
  3. def ping(host):
  4. rc = subprocess.call(
  5. 'ping -c2 %s &> /dev/null' % host,
  6. shell=True
  7. )
  8. if rc:
  9. print('%s:down' % host)
  10. else:
  11. print('%s:up' % host)
  12. if __name__ == '__main__':
  13. ips = ['172.40.58.%s' % i for i in range(1,255)]
  14. for ip in ips:
  15. #创建线程,ping是上面定义的函数,args是传给ping函数的参数
  16. t = threading.Thread(target=ping,args=(ip,))
  17. t.start() #执行ping(ip)

108-多线程的效率

python的多线程有一个GIL(全局解释器锁),使得多个线程,某一时刻只有一个线程发送给CPU处理。所以多线程不适用计算密集型应用。更适合IO密集型应用。以下两次计算5000万次加法运算和不用多线程相比,没有效率的提升。因为CPU有上下文切换,甚至可能多线程更慢。

  1. import time
  2. import threading
  3. def calc():
  4. result = 0
  5. for i in range(1,5000001):
  6. result += 1
  7. print(result)
  8. if __name__ == '__main__':
  9. start = time.time()
  10. t1 = threading.Thread(target=calc)
  11. t1.start()
  12. t2 = threading.Thread(target=calc)
  13. t2.start()
  14. t1.join() #挂起主进程,当t1执行完后才继续向下执行
  15. t2.join()
  16. end = time.time()
  17. print(end - start)

109-基于多线程的时间消息队列

与[106-基于多进程的时间消息服务器]类似,只是换成了多线程

  1. import socket
  2. import threading
  3. from time import strftime
  4. class TcpTimeServer:
  5. def __init__(self, host='', port=12345):
  6. self.addr = (host, port)
  7. self.serv = socket.socket()
  8. self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  9. self.serv.bind(self.addr)
  10. self.serv.listen(1)
  11. def chat(self, c_sock):
  12. while True:
  13. data = c_sock.recv(1024)
  14. if data.strip() == b'quit':
  15. break
  16. data = '[%s] %s' % (strftime('%H:%M:%S'), data.decode('utf8'))
  17. c_sock.send(data.encode('utf8'))
  18. c_sock.close()
  19. def mainloop(self):
  20. while True:
  21. cli_sock, cli_addr = self.serv.accept()
  22. t = threading.Thread(target=self.chat,args=(cli_sock,))
  23. t.start()
  24. self.serv.close()
  25. if __name__ == '__main__':
  26. s = TcpTimeServer()
  27. s.mainloop()

110-并行批量管理远程服务器

脚本名为remote_comm.py,执行方式如下:

python3 remote_comm.py  #服务器IP地址文件  "在远程服务器上要执行的命令"

如:

python3 remote_comm.py serverips.txt  "useradd zhangsan"

远程服务器密码以及交互方式获得。

  1. import sys
  2. import getpass
  3. import paramiko
  4. import threading
  5. import os
  6. def remote_comm(host,pwd,command):
  7. ssh = paramiko.SSHClient()
  8. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
  9. ssh.connect(hostname=host,username='root',password=pwd)
  10. stdin,stdout,stderr = ssh.exer_command(command)
  11. out = stdout.read()
  12. error = stderr.read()
  13. if out:
  14. print('[%s] OUT:\n%s' % (host,out.decode('utf8')))
  15. if error:
  16. print('[%s] ERROR:\n%s' % (host,error.decode('utf8')))
  17. ssh.close()
  18. if __name__ == '__main__':
  19. if len(sys.argv) != 3:
  20. print('Usage:%s ipaddr_file "command"' % sys.argv[0])
  21. exit(1)
  22. if not os.path.isfile(sys.argv[1]):
  23. print('No such file:',sys.argv[1])
  24. exit(2)
  25. fname = sys.argv[1]
  26. command = sys.argv[2]
  27. pwd = getpass.getpass()
  28. with open(fname) as fobj:
  29. ips = [line.strip() for line in fobj]
  30. for ip in ips:
  31. t = threading.Thread(target=remote_comm,args=(ip,pwd,command))
  32. t.start()

111-配置IP地址

RHEL7主机有四块网卡,名为eth0/eth1/eth2/eth3.为四块网卡配置ip地址

  1. #!/usr/bin/env python
  2. import sys
  3. import re
  4. def configip(fname,ip_addr,if_ind):
  5. content = """TYPE=Etherent
  6. BOOTPROTO=none
  7. NAME=eth%s
  8. DEVICE=eth%s
  9. ONBOOT=yes
  10. IPADDR=%s
  11. PREFIX=24
  12. """ % (if_ind,if_ind,ip_addr)
  13. with open(fname,'w') as fobj:
  14. fobj.write(content)
  15. def check_ip(ip_addr): #判断IP地址是不是x.x.x.x格式
  16. m = re.match(r'(\d{1,3}\.){3}\d{1,3}$',ip_addr)
  17. if not m:
  18. return False
  19. return True
  20. def show_menu():
  21. prompt = """Configure IP Address:
  22. (0)eth0
  23. (1)eth1
  24. (2)eth2
  25. (3)eth3
  26. Your choice(0/1/2/3):"""
  27. try:
  28. if_ind = raw_input(prompt).strip()[0]
  29. except:
  30. print('Invaild input')
  31. sys.exit(1)
  32. if if_ind not in '0123':
  33. print('Wrong Selection.Use 0/1/2/3')
  34. sys.exit(2)
  35. fname = '/etc/sysconfig/network-s/ifcfg-eth%s' if_ind
  36. ip_addr = raw_input('ip address:').strip()
  37. result = check_ip(ip_addr)
  38. if not result:
  39. print('Invaild ip address')
  40. sys.exit(3)
  41. configip(fname,ip_addr,if_ind)
  42. print('\033[32;1mConfigure iP address done.Please execute "systemct1 restart NetworkManager"\033[0m')
  43. if __name__ == '__main__':
  44. show_menu()

112-模拟字符串lstrip用法

思路:

1、取出字符串长度

2、通过range和字符串长度得到字符串下标

3、找到非空字符串下标,剩余部分取出切片

4、如果字符串没有非空字符,返回空串

  1. whitesps = ' \r\n\v\f\t'
  2. def rmlsps(astr):
  3. for i in range(len(astr)):
  4. if astr[i] not in whitesps:
  5. return astr[i:]
  6. else: #所有字符均为空,循环正常结束,返回空串
  7. return ''
  8. if __name__ == '__main__':
  9. print(rmlsps(' \thello '))

113-模拟字符串rstrip用法

  1. whitesps = ' \r\n\v\f\t'
  2. def rmrsps(astr):
  3. for i in range(-1,len(astr),-1): #自右向左,下标为负
  4. if astr[i] not in whitesps:
  5. return astr[:i + 1] #结束下标对应的字符不包含,所以加1
  6. else: #所有字符均为空,循环正常结束,返回空串
  7. return ''
  8. if __name__ == '__main__':
  9. print(rmrsps(''))
  10. print(rmrsps(' \thello '))

114-可变不可变对象的效率

python是一种解释型语言,执行效率要比C这样的编译型语言差得多,但是也应该注意它的效率。python的各种数据类型,按更新模型可以分为可变类型(如列表、字典)和不可变类型(如数字、字符串和元组)。多使用可变类型,它的执行效率比不可变类型要高。在[36-生成密码/验证码]中,将结果保存到一个名为result的变量中。result是字符串,字符串不可变,所以python工作时,首先要申请一段内存储result的初值(空串),随机取得一个字符后(如’a’),result += 'a’实际上是要重新申请一个新的内存,把新字符串存储进去。如此往复,有几次循环,就要重新分配几次内存。如果变量result使用列表,只需要为其分配一次内存即可,因为列表是可变的.代码可以更改为以下样式:

  1. from random import choice
  2. import string
  3. all_chs = string.ascii_letters + string.digits #大小写字母加数字
  4. def gen_pass(n = 8):
  5. result = []
  6. for i in range(n):
  7. ch = choice(all_chs)
  8. result.append(ch)
  9. return ''.join(result)
  10. if __name__ == '__main__':
  11. print(gen_pass()) #随机的8位密码
  12. print(gen_pass(4)) #随机的4位密码
  13. print(gen_pass(10)) #随机的10位密码

115-比较文件的差异

比较两个文件的差异,可以直接使用vim

# vim -d /etc/passwd /etc/passwd-

python标准库提供了一个difflib,可以进行文件的比较,并且可以生成网页的形式。

  1. import difflib
  2. import webbrowser
  3. import sys
  4. import string
  5. import os
  6. from random import choice
  7. def rand_chs(n=8): #默认生成8个随机字符
  8. all_chs = string.ascii_letters + string.digits
  9. result = [choice(all_chs) for i in range(n)]
  10. return ''.join(result)
  11. #函数接收两个相似的文件名,返回HTML形式的字符串
  12. def make_diff(lfile,rfile):
  13. d = difflib.HtmlDiff()
  14. #将两个文件分别读到列表中
  15. with open(lfile) as fobj:
  16. ldata = fobj.readlines()
  17. with open(rfile) as fobj:
  18. rdata = fobj.readlines()
  19. return d.make_file(ldata,rdata) #返回HTML格式内容
  20. if __name__ == '__main__':
  21. try:
  22. lfile = sys.argv[1]
  23. rfile = sys.argv[2]
  24. except IndexError:
  25. print('Usage:%s file1 file2' % sys.argv[0])
  26. sys.exit(1)
  27. if not os.path.isfile(lfile):
  28. print('No such file:',lfile)
  29. sys.exit(2)
  30. if not os.path.isfile(rfile):
  31. print('No such file:',rfile)
  32. sys.exit(3)
  33. data = make_diff(lfile,rfile)
  34. #以下只是说明内容增加中文显示,非必须项
  35. data = data.replace(';Added',';Added(增加) ')
  36. data = data.replace('>Changed', '>Changed(改变) ')
  37. data = data.replace('>Deleted', '>Deleted(被删除) ')
  38. data = data.replace('(f)irst change', '(f)irst change(第一处变更) ')
  39. data = data.replace('(n)ext change', '(n)ext change(下一处变更) ')
  40. data = data.replace('(t)op', ';(t)op(回到顶部) ')
  41. html_file = '/tmp/%s.html' % rand_chs() #用随机字符生成文件名
  42. with open(html_file,'w') as fobj:
  43. fobj.write(data)
  44. webbrowser.open_new_tab('file:///%s' % html_file) #使用浏览器打开文件

116-插入排序

插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序;首先将第一个作为已经排好序的,然后每次从后的取出插入到前面并排序;

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)
  • 稳定性:稳定
  1. def insert_sort(ilist):
  2. for i in range(len(ilist)):
  3. for j in range(i):
  4. if ilist[i] < ilist[j]:
  5. ilist.insert(j, ilist.pop(i))
  6. break
  7. return ilist
  8. ilist = insert_sort([4,5,6,7,3,2,6,9,8])
  9. print ilist

117-希尔排序

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止

  • 时间复杂度:O(n)
  • 空间复杂度:O(n√n)
  • 稳定性:不稳定
  1. def shell_sort(slist):
  2. gap = len(slist)
  3. while gap > 1:
  4. gap = gap // 2
  5. for i in range(gap, len(slist)):
  6. for j in range(i % gap, i, gap):
  7. if slist[i] < slist[j]:
  8. slist[i], slist[j] = slist[j], slist[i]
  9. return slist
  10. slist = shell_sort([4,5,6,7,3,2,6,9,8])
  11. print slist

118-冒泡排序

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)
  • 稳定性:稳定
  1. list01 = [1,89,546,54,2,58,98]
  2. def sortport():
  3. for i in range(len(list01)-1):
  4. for j in range(len(list01)-1-i):
  5. if list01[j] > list01[j+1]:
  6. list01[j],list01[j+1] = list01[j+1],list01[j]
  7. return list01
  8. l = sortport()
  9. print(l)

119-快速排序:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

  • 时间复杂度:O(nlog₂n)
  • 空间复杂度:O(nlog₂n)
  • 稳定性:不稳定
  1. def quick_sort(qlist):
  2. if qlist == []:
  3. return []
  4. else:
  5. qfirst = qlist[0]
  6. qless = quick_sort([l for l in qlist[1:] if l < qfirst])
  7. qmore = quick_sort([m for m in qlist[1:] if m >= qfirst])
  8. return qless + [qfirst] + qmore
  9. qlist = quick_sort([4,5,6,7,3,2,6,9,8])
  10. print qlist

120-选择排序:

第1趟,在待排序记录r1 ~ r[n]中选出最小的记录,将它与r1交换;第2趟,在待排序记录r2 ~ r[n]中选出最小的记录,将它与r2交换;以此类推,第i趟在待排序记录r[i] ~ r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)
  • 稳定性:不稳定
  1. def select_sort(slist):
  2. for i in range(len(slist)):
  3. x = i
  4. for j in range(i, len(slist)):
  5. if slist[j] < slist[x]:
  6. x = j
  7. slist[i], slist[x] = slist[x], slist[i]
  8. return slist
  9. slist = select_sort([4,5,6,7,3,2,6,9,8])
  10. print slist

121-计算x的n次方的方法

  1. def power(x,n):
  2. s = 1
  3. while n > 0:
  4. n = n - 1
  5. s = s * x
  6. return s

122-计算aa + bb + c*c + ……

  1. def clas(*numbers):
  2. sum = 0
  3. for n in numbers:
  4. sum = sum + n * n
  5. return sum

123-计算阶乘 n!

  1. #第一种方法
  2. def fac(n):
  3. num = int(input("请输入一个数字:"))
  4. factorial = 1
  5. #查看数字是负数,0或正数
  6. if num < 0:
  7. print("抱歉,负数没有阶乘")
  8. elif num == 0:
  9. print("0的阶乘为1")
  10. else:
  11. for i in range(1,num + 1):
  12. factorial = factorial * i
  13. print("%d 的阶乘为%d" %(num,factorial))
  14. #第二种方法
  15. def factorial(n):
  16. result = 1
  17. for i in range(1,n):
  18. result *= i
  19. return result
  20. #第三种方法
  21. def fact(n):
  22. if n == 1:
  23. return 1
  24. return n * fact(n - 1)

124-列出当前目录下的所有文件和目录名

[d for d in os.listdir('.')]

125-把一个list中所有的字符串变成小写:

  1. l = ['Hello','World','IBM','Apple']
  2. a = [s.lower() for s in l]
  3. print(a)

126-有一本100页的书,可以一天看一页,也可以一天看两页,总共有多少种看法?

  1. def read_book(n):
  2. if n == 1:
  3. return 1
  4. elif n == 2:
  5. return 2
  6. else:
  7. return read_book(n-1) + read_book(n-2)
  8. a = read_book(10)
  9. print(a)

127-输出某个路径下的所有文件和文件夹的路径

  1. import os
  2. def print_dir():
  3. filepath = input("请输入一个路径:")
  4. if filepath == "":
  5. print("请输入正确路径")
  6. else:
  7. for i in os.listdir(filepath): #获取目录中的文件及子目录列表
  8. print(os.path.join(filepath,i)) #把路径组合起来
  9. print(print_dir())

128-输出某个路径及其子目录下的所有文件路径

  1. import os
  2. def show_dir(filepath):
  3. for i in os.listdir(filepath):
  4. path = (os.path.join(filepath,i))
  5. print(path)
  6. if os.path.isdir(path): #isdir()判断是否是目录
  7. show_dir(path) #如果是目录,使用递归方法
  8. filepath = "C:\Program File\Internet Explorer"
  9. show_dir(filepath)

129-输出某个路径及其子目录下所有以.html为后缀的文件

  1. import os
  2. def print_dir(filepath):
  3. for i in os.listdir(filepath):
  4. path = os.path.join(filepath,i)
  5. if os.path.isdir(path):
  6. print_dir(path)
  7. if path.endswith(".html"):
  8. print(path)
  9. filepath = "E:\PycharmProjects"
  10. print_dir(filepath)

130-把原字典的键值对颠倒并生产新的字典

  1. dict01 = {"A":"a","B":"b","C":"c"}
  2. dict02 = {y:x for x,y in dict01.items()}
  3. print(dict02)
  4. #{'a': 'A', 'b': 'B', 'c': 'C'}

131-打印九九乘法表

  1. for i in range(1,10):
  2. for j in range(1,i+1):
  3. #print('{}x{}={}\t'.format(j,i,i*j),end='') #两种都可以
  4. print('%dx%d=%d\t'%(i,j,i*j),end='')
  5. print()

132-替换列表中所有的3为3a

  1. num = ["harden","lampard",3,34,45,56,76,78,3,3,3]
  2. print(num.count(3))
  3. print(num.index(3))
  4. for i in range(num.count(3)): #获取3出现的次数
  5. ele_index = num.index(3) #获取首次出现3的坐标
  6. num[ele_index] = "3a" #修改3为3a
  7. print(num)

133-打印每个名字

  1. l = ["James","Meng","Xin"]
  2. for i in range(len(l)):
  3. print("Hello ,%s"%l[i])

134-合并去重

  1. list01 = [2,3,8,4,9,5,6]
  2. list02 = [5,6,10,17,11,2]
  3. list03 = list01 + list02
  4. print(list03)
  5. print(set(list03))
  6. print(list(set(list03)))

135-随机生成验证码的两种方式

  1. #第一种方法
  2. import random
  3. list01 = []
  4. for i in range(65,91):
  5. list01.append(chr(i)) #通过for循环遍历assi追加到空列表中
  6. for j in range(97,123):
  7. list01.append(chr(j))
  8. for k in range(48,58):
  9. list01.append(chr(k))
  10. ma = random.sample(list01,6)
  11. print(ma) #获取到的为列表
  12. ma = ''.join(ma) #将列表转化为字符串
  13. print(ma)
  14. #第二种方法
  15. import random,string
  16. str01 = "0123456789"
  17. str02 = string.ascii_letters #string.ascii_letters 包含所有字母(大写或小写)的字符串
  18. str03 = str01 + str02
  19. ma1 = random.sample(str03,6)
  20. ma2 = ''.join(ma1)
  21. print(ma2)

136-猜数字游戏

  1. import random
  2. i = 1
  3. a = random.randint(0,100)
  4. b = int(input("请输入0-100中的一个数字\n然后查看是否与电脑一样:"))
  5. while a != b:
  6. if a > b:
  7. print("你第%d输入的数字小于电脑随机数"%i)
  8. b = int(input("请再次输入数字:"))
  9. else:
  10. print("你第%d输入的数字大于电脑随机数"%i)
  11. b = int(input("请再次输入数字:"))
  12. i += 1
  13. else:
  14. print("恭喜你,你第%d输入的数字与电脑随机数%d一样"%(i,b))

137-计算平方根

  1. num = float(input("请输入一个数字:"))
  2. num_sqrt = num ** 0.5
  3. print('%0.2f 的平方根为 %0.2f'%(num,num_sqrt))

138-判断字符串是否只由数字组成

  1. #第一种方法
  2. def is_number(s):
  3. try:
  4. float(s)
  5. return True
  6. except ValueError:
  7. pass
  8. try:
  9. import unicodedata
  10. unicodedata.numeric(s)
  11. return True
  12. except (TypeError,ValueError):
  13. pass
  14. return False
  15. c = is_number("455")
  16. print(c)
  17. #第二种方法
  18. print("chri".isdigit()) # 检测字符串是否只由字符串组成
  19. print("000".isnumber()) # 检测字符串是否只由字符串组成,这种方法只针对unicode对象

139-判断奇偶数

  1. #第一种方法
  2. num = int(input("输入一个数字: "))
  3. if (num % 2) == 0:
  4. print("{0} 是偶数".format(num))
  5. else:
  6. print("{0} 是奇数".format(num))
  7. #第二种方法
  8. while True:
  9. try:
  10. num = int(input('输入一个整数:')) #判断输入是否为整数
  11. except ValueError: #不是纯数字需要重新输入
  12. print("输入的不是整数!")
  13. continue
  14. if num % 2 == 0:
  15. print('偶数')
  16. else:
  17. print('奇数')
  18. break

140-判断闰年

  1. #第一种方法
  2. year = int(input("输入一个年份: "))
  3. if (year % 4) == 0:
  4. if (year % 100) == 0:
  5. if (year % 400) == 0:
  6. print("{0} 是闰年".format(year)) # 整百年能被400整除的是闰年
  7. else:
  8. print("{0} 不是闰年".format(year))
  9. else:
  10. print("{0} 是闰年".format(year)) # 非整百年能被4整除的为闰年
  11. else:
  12. print("{0} 不是闰年".format(year))
  13. #第二种方法
  14. year = int(input("请输入一个年份:"))
  15. if (year % 4) == 0 and (year % 100) != 0 or (year % 400) == 0:
  16. print("{0}是闰年".format(year))
  17. else:
  18. print("{0}不是闰年".format(year))
  19. #第三种方法
  20. import calendar
  21. year = int(input("请输入年份:"))
  22. check_year=calendar.isleap(year)
  23. if check_year == True:
  24. print ("%d是闰年"% year)
  25. else:
  26. print ("%d是平年"% year)

141-获取最大值

  1. #第一种方法
  2. N = int(input('输入需要对比大小数字的个数:'))
  3. print("请输入需要对比的数字:")
  4. num = []
  5. for i in range(1,N+1):
  6. temp = int(input('输入第 %d 个数字:' % i))
  7. num.append (temp)
  8. print('您输入的数字为:',num)
  9. print('最大值为:',max(num))
  10. #第二种方法
  11. N = int(input('输入需要对比大小数字的个数:\n'))
  12. num = [ int(input('请输入第 %d 个对比数字: \n'%i))for i in range(1,N+1)]
  13. print('您输入的数字为:',num)
  14. print('最大值为: ',max(num))
  15. #第三种方法(不适用内置函数)
  16. def getMax(arr):
  17. for i in range(0, len(arr)):
  18. for j in range(i + 1, len(arr)):
  19. first = int(arr[i])
  20. second = int(arr[j])
  21. if first < second:
  22. arr[i] = arr[j]
  23. arr[j] = first
  24. print(arr[0])
  25. arr = [19, 29, 30, 48]
  26. getMax(arr)

142-斐波那契数列

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13;特别指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和。

  1. # 判断输入的值是否合法
  2. if nterms <= 0:
  3. print("请输入一个正整数。")
  4. elif nterms == 1:
  5. print("斐波那契数列:")
  6. print(n1)
  7. else:
  8. print("斐波那契数列:")
  9. print(n1, ",", n2, end=" , ")
  10. while count < nterms:
  11. nth = n1 + n2
  12. print(n1+n2, end=" , ")
  13. # 更新值
  14. n1 = n2
  15. n2 = nth
  16. count += 1

143-十进制转二进制、八进制、十六进制

  1. # 获取输入十进制数
  2. dec = int(input("输入数字:"))
  3. print("十进制数为:", dec)
  4. print("转换为二进制为:", bin(dec))
  5. print("转换为八进制为:", oct(dec))
  6. print("转换为十六进制为:", hex(dec))

144-最大公约数

  1. def hcf(x, y):
  2. """该函数返回两个数的最大公约数"""
  3. # 获取最小值
  4. if x > y:
  5. smaller = y
  6. else:
  7. smaller = x
  8. for i in range(1, smaller + 1):
  9. if ((x % i == 0) and (y % i == 0)):
  10. hcf = i
  11. return hcf
  12. # 用户输入两个数字
  13. num1 = int(input("输入第一个数字: "))
  14. num2 = int(input("输入第二个数字: "))
  15. print(num1, "和", num2, "的最大公约数为", hcf(num1, num2))

145-最小公倍数

  1. # 定义函数
  2. def lcm(x, y):
  3. # 获取最大的数
  4. if x > y:
  5. greater = x
  6. else:
  7. greater = y
  8. while(True):
  9. if((greater % x == 0) and (greater % y == 0)):
  10. lcm = greater
  11. break
  12. greater += 1
  13. return lcm
  14. # 获取用户输入
  15. num1 = int(input("输入第一个数字: "))
  16. num2 = int(input("输入第二个数字: "))
  17. print( num1,"和", num2,"的最小公倍数为", lcm(num1, num2))

146-简单计算器

  1. # 定义函数
  2. def add(x, y):
  3. """相加"""
  4. return x + y
  5. def subtract(x, y):
  6. """相减"""
  7. return x - y
  8. def multiply(x, y):
  9. """相乘"""
  10. return x * y
  11. def divide(x, y):
  12. """相除"""
  13. return x / y
  14. # 用户输入
  15. print("选择运算:")
  16. print("1、相加")
  17. print("2、相减")
  18. print("3、相乘")
  19. print("4、相除")
  20. choice = input("输入你的选择(1/2/3/4):")
  21. num1 = int(input("输入第一个数字: "))
  22. num2 = int(input("输入第二个数字: "))
  23. if choice == '1':
  24. print(num1, "+", num2, "=", add(num1, num2))
  25. elif choice == '2':
  26. print(num1, "-", num2, "=", subtract(num1, num2))
  27. elif choice == '3':
  28. print(num1, "*", num2, "=", multiply(num1, num2))
  29. elif choice == '4':
  30. if num2 != 0:
  31. print(num1, "/", num2, "=", divide(num1, num2))
  32. else:
  33. print("分母不能为0")
  34. else:
  35. print("非法输入")

147-生成日历

  1. # 引入日历模块
  2. import calendar
  3. # 输入指定年月
  4. yy = int(input("输入年份: "))
  5. mm = int(input("输入月份: "))
  6. # 显示日历
  7. print(calendar.month(yy, mm))

148-文件IO

  1. # 写文件
  2. with open("test.txt", "wt") as out_file:
  3. out_file.write("该文本会写入到文件中\n看到我了吧!")
  4. # Read a file
  5. with open("test.txt", "rt") as in_file:
  6. text = in_file.read()
  7. print(text)

149-字符串判断

  1. # 测试实例一
  2. print("测试实例一")
  3. str = "runoob.com"
  4. print(str.isalnum()) # 判断所有字符都是数字或者字母
  5. print(str.isalpha()) # 判断所有字符都是字母
  6. print(str.isdigit()) # 判断所有字符都是数字
  7. print(str.islower()) # 判断所有字符都是小写
  8. print(str.isupper()) # 判断所有字符都是大写
  9. print(str.istitle()) # 判断所有单词都是首字母大写,像标题
  10. print(str.isspace()) # 判断所有字符都是空白字符、\t、\n、\r
  11. print("------------------------")
  12. # 测试实例二
  13. print("测试实例二")
  14. str = "Bake corN"
  15. print(str.isalnum())
  16. print(str.isalpha())
  17. print(str.isdigit())
  18. print(str.islower())
  19. print(str.isupper())
  20. print(str.istitle())
  21. print(str.isspace())

150-字符串大小写转换

  1. str = "https://www.cnblogs.com/ailiailan/"
  2. print(str.upper()) # 把所有字符中的小写字母转换成大写字母
  3. print(str.lower()) # 把所有字符中的大写字母转换成小写字母
  4. print(str.capitalize()) # 把第一个字母转化为大写字母,其余小写
  5. print(str.title()) # 把每个单词的第一个字母转化为大写,其余小写

151-计算每个月天数

  1. import calendar
  2. monthRange = calendar.monthrange(2016,9)
  3. print(monthRange)

152-获取昨天的日期

  1. # 引入 datetime 模块
  2. import datetime
  3. def getYesterday():
  4. today=datetime.date.today()
  5. oneday=datetime.timedelta(days=1)
  6. yesterday=today-oneday
  7. return yesterday
  8. # 输出
  9. print(getYesterday())

153-列表去重

  1. #方法一
  2. def delList(L):
  3. L1 = [ ]
  4. for i in L:
  5. if i not in L1:
  6. L1.append(i)
  7. return L1
  8. print(delList(L1))
  9. #方法二:去重
  10. L1=listset(L))
  11. #a = [2,2,2,2,6,84,5,9]
  12. #print(delList(a))
  13. #a2 = list(set(a))
  14. #print(a2)

154-列表插入

  1. l = [1,2,3]
  2. l.insert(0,4) #在列表的索引处插入
  3. print(l)

155-列表元素替换

  1. x = "hello world "
  2. y = x.replace("hello","hi")
  3. print(y) # 结果为:hi world

156-a=1,b=2,不用中间变量交换 a 和 b 的值?

  1. #方法一:
  2. a = a+b
  3. b = a-b
  4. a = a-b
  5. #方法二:
  6. a = a^b
  7. b =b^a
  8. a = a^b
  9. #方法三:
  10. a,b = b,a

157-下面这段代码的输出结果将是什么?请解释?

  1. class Parent(object):
  2. x=1
  3. class Child1(Parent):
  4. pass
  5. class Child2(Parent):
  6. pass
  7. print(Parent.x, Child1.x, Child2.x)
  8. Child1.x = 2
  9. print( Parent.x, Child1.x, Child2.x)
  10. Parent.x = 3
  11. print( Parent.x, Child1.x, Child2.x)
  12. #结果为:
  13. 1 1 1 #继承自父类的类属性 x,所以都一样,指向同一块内存地址。
  14. 1 2 1 #更改 Child1,Child1 的 x 指向了新的内存地址。
  15. 3 2 3 #更改 Parent,Parent 的 x 指向了新的内存地址。

158-阅读下面的代码,写出 A0,A1 至 An 的最终值。

  1. A0 = dict(zip(('a','b','c','d','e'),(1,2,3,4,5)))
  2. A1 = range(10)
  3. A2 = [i for i in A1 if i in A0]
  4. A3 = [A0[s] for s in A0] #[]
  5. A4 = [i for i in A1 if i in A3]
  6. A5 = {i:i*i for i in A1}
  7. A6 = [[i,i*i] for i in A1]
  8. #结果为:
  9. A0 = {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
  10. A1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  11. A2 = []
  12. A3 = [1, 3, 2, 5, 4]
  13. A4 = [1, 2, 3, 4, 5]
  14. A5 = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
  15. A6 = [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36],[7, 49],[8, 64] [9,81]]

159-考虑以下 Python 代码,如果运行结束,命令行中的运行结果是什么?

  1. l = []
  2. for i in range(10):
  3. l.append({'num':i})
  4. print (l)
  5. #结果为:
  6. [{'num':0},{'num':1},{'num':2},{'num':3},{'num':4},{'num':5},{'num':6},{'num':7},{'num':8},{'num':9}]

再考虑以下代码,运行结束后的结果是什么?

  1. l = []
  2. a = {'num':0}
  3. for i in range(10):
  4. a['num'] = i
  5. l.append(a)
  6. print(l)
  7. #结果为:
  8. [{'num':9},{'num':9},{'num':9},{'num':9},{'num':9},{'num':9},{'num':9},{'num':9},{'num':9},{'num':9}]

160-返回文件及其子文件路径

  1. def print_directory_contents(sPath):
  2. """
  3. 这个函数接收文件夹的名称作为输入参数
  4. 返回该文件夹中文件的路径
  5. 以及其包含文件夹中文件的路径
  6. """
  7. # ------------代码如下--------------------
  8. import os
  9. for sChild in os.listdir(sPath):
  10. sChildPath = os.path.join(sPath, sChild)
  11. if os.path.isdir(sChildPath):
  12. print_directory_contents(sChildPath)
  13. else:
  14. print(sChildPath)

161-输入某年某月某日,判断这一天是这一年的第几天?(可以用 Python 标准库)

  1. import datetime
  2. def dayofyear():
  3. year = input("请输入年份:")
  4. month = input("请输入月份:")
  5. day = input("请输入天:")
  6. date1 = datetime.date(year=int(year),month=int(month),day=int(day))
  7. date2 = datetime.date(year=int(year),month=1,day=1)
  8. return (date1 - date2 + 1).days

162-打乱一个排好序的 list 对象 alist?

  1. import random
  2. alist = [1,2,3,4,5,98,56]
  3. random.shuffle(alist)
  4. print(alist)

163-Python 是如何进行类型转换的?

  1. int(x,base=10) #x字符串或数字,base进制数,默认十进制 浮点转为整数
  2. float #整数转换为浮点型
  3. complex(1,2) #转换为复数
  4. str(10) #将对象转换为字符串
  5. repe() #将对象转换为表达式字符串
  6. repr(dict) #将对象转换为表达式字符串
  7. eval(str) #用来计算在字符串中有效的python表达式,返回一个对象
  8. tuple(listi) #将列表转化为元组
  9. list() #将元组转换为列表
  10. set #转换集合

164-按 alist 中元素的 age 由大到小排序

  1. alist =[{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}]
  2. def sort_by_age(list1):
  3. return sorted(alist,key=lambda x:x['age'],reverse=True)
  4. re = sort_by_age(alist)
  5. print(re)

165-写一个列表生成式,产生一个公差为 11 的等差数列?

print([x*11 for x in range(10)])

166-给定两个列表,怎么找出他们相同的元素和不同的元素?

  1. 1. list1 = [1,2,3]
  2. 2. list2 = [3,4,5]
  3. 3. set1 = set(list1)
  4. 4. set2 = set(list2)
  5. 5. print(set1&set2)
  6. 6. print(set1^set2)

167-请写出一段 Python 代码实现删除一个 list 里面的重复元素?

比较容易记忆的是用内置的 set:

  1. l1 = ['b','c','d','b','c','a','a']
  2. l2 = list(set(l1))
  3. print(l2)

如果想要保持他们原来的排序:
用 list 类的 sort 方法:

  1. l1 = ['b','c','d','b','c','a','a']
  2. l2 = list(set(l1))
  3. l2.sort(key=l1.index)
  4. print (l2)

也可以这样写:

  1. l1 = ['b','c','d','b','c','a','a']
  2. l2 = sorted(set(l1),key=l1.index)
  3. print (l2)

也可以用遍历:

  1. l1 = ['b', 'c', 'd', 'b', 'c', 'a', 'a']
  2. l2 = []
  3. for i in l1:
  4. if not i in l2:
  5. l2.append(i)
  6. print (l2)

168-获取 1~100 被 6 整除的偶数?

  1. def A():
  2. alist = []
  3. for i in range(1,100):
  4. if i % 6 == 0:
  5. alist.append(i)
  6. print(alist)
  7. A()

169-将以下 3 个函数按照执行效率高低排序

  1. def f1(lIn):
  2. l1 = sorted(lIn)
  3. l2 = [i for i in l1 if i<0.5]
  4. return [i*i for i in l2]
  5. def f2(lIn):
  6. l1 = [i for i in l1 if i<0.5]
  7. l2 = sorted(l1)
  8. return [i*i for i in l2]
  9. def f3(lIn):
  10. l1 = [i*i for i in lIn]
  11. l2 = sorted(l1)
  12. return [i for i in l1 if i<(0.5*0.5)]

按执行效率从高到低排列:f2、f1 和 f3。要证明这个答案是正确的,你应该知道如何分析自己代码的性能。Python
中有一个很好的程序分析包,可以满足这个需求。

  1. import random
  2. import cProfile
  3. lIn = [random.random() for i in range(100000)]
  4. cProfile.run('f1(lIn)')
  5. cProfile.run('f2(lIn)')
  6. cProfile.run('f3(lIn)')

170-请尝试用“一行代码”实现将 1-N 的整数列表以 3 为单位分组,比如 1-100 分组后为?

  1. print([[x for x in range(1,100)][i:i+3] for i in range(0,len(list_a),3)])

171-给定一个 int list a,满足 a[i + 1]>=a[i],给定 int key找出 list a 中第一个大于等于 key 的元素的 index,无满足要求的元素则返回-1

  1. def findindex(int_list,int_key):
  2. int_list = sorted(int_list)
  3. for i in range(len(int_list)):
  4. if int_list[i] == int_key:
  5. return i
  6. return -1
  7. if __name__ == "__main__":
  8. lista = [12,3,4,5,8,6]
  9. index = findindex(lista,5)
  10. print(index)

172-字典转换为字符串

  1. a = {"name":"jack","age":30}
  2. #现在需要生成字符串:name=jack|age=30
  3. #请用一行代码实现:
  4. s = '|'.join([str(x)+'='+str(a[x]) for x in a])

173-请将这两个list合并,去重并按照升序排列

  1. list1 = [2, 3, 8, 4, 9, 5, 6]
  2. list2 = [5, 6, 10, 17, 11, 2]
  3. list_new = list1 + list2
  4. list = []
  5. for x in list_new:
  6. if x not in list:
  7. list.append(x)
  8. list.sort()
  9. print(list)

174-写一段程序,判断字符串内左右括号是否配对

  1. class SStack():
  2. def __init__(self):
  3. self.__elem = []
  4. def is_empty(self):
  5. return self.__elem == []
  6. def top(self):
  7. return self.__elem[-1]
  8. def push(self,elem):
  9. self.__elem.append(elem)
  10. def pop(self):
  11. return self.__elem.pop()
  12. def kuohao(text):
  13. kinds = "()[]{}" #用来定义出现的括号,因为待匹配的字符中含有其他的字符,我们值检查括号是否匹配,而且是只有出现括号后再进行匹配
  14. zuo = "([{" #定义左括号,如果是左括号就入栈
  15. dict0 = {")":"(","]":"[","}":"{"} #匹配字典,这个字典定义了匹配规则,如果字典的键值对匹配就可以认定括号是匹配的
  16. def pipei(text): #将等待匹配的文本输入,这个函数的目标是从文本中过滤出括号
  17. i,text_len = 0,len(text) #扫描指针用来记录匹配位置
  18. while True:
  19. while i< text_len and text[i] not in kinds: #用来寻找到括号
  20. i += 1
  21. if i >= text_len: #如果字符串中没有包含括号则结束
  22. return
  23. yield text[i],i #返回括号字符和字符对应的下标
  24. i += 1
  25. st = SStack()
  26. for text0,i in pipei(text):#获取得到的符号进行匹配,因为pipei()是一个含有yield函数,所以是一个生成器,调用它会产生一个可迭代的对象
  27. if text0 in zuo: #如果是左括号就让它入栈
  28. #print(text0)
  29. st.push(text0)
  30. elif st.pop() != dict0[text0]:#如果是右括号,就弹出栈顶元素进行匹配检查
  31. print("本次不匹配")
  32. return False #遇到不匹配的,就直接退出函数,结束匹配
  33. print("所有的括号都已经匹配完毕,匹配成功!") #如果函数还能够执行到这里说明所有的括号都是匹配的
  34. return True
  35. #kuohao("({{[]}})")
  36. kuohao("[{}]")

175-将一个正整数分解质因数。例如输入90,打印90=233*5.

  1. n = num = int(input('请输入一个数字:')) # 用num保留初始值
  2. f = [] # 存放质因数的列表
  3. for j in range(int(num / 2) + 1): # 判断次数仅需该数字的一半多1次
  4. for i in range(2, n):
  5. t = n % i # i不能是n本身
  6. if t == 0: # 若能整除
  7. f.append(i) # 则表示i是质因数
  8. # 除以质因数后的n重新进入判断,注意应用两个除号,使n保持整数
  9. n = n // i
  10. break # 找到1个质因数后马上break,防止非质数却可以整除的数字进入质因数列表
  11. if len(f) == 0: # 若一个质因数也没有
  12. print('该数字没有任何质因数。')
  13. else: # 若至少有一个质因数
  14. f.append(n) # 此时n已被某个质因数整除过,最后一个n也是其中一个质因数
  15. f.sort() # 排下序
  16. print('%d=%d' % (num, f[0]), end='')
  17. for i in range(1, len(f)):
  18. print('*%d' % f[i], end='')

176-实现一个函数,在给定数组中寻找第2 大的数。

  1. def fn():
  2. a=[1,3,5,7,9]
  3. return sorted(a[1])

177-求二叉树深度

  1. class TreeNode(object):
  2. def __init__(self, x):
  3. self.val = x
  4. self.left = None
  5. self.right = None
  6. class Solution(object):
  7. def isBalanced(self, root):
  8. if root==None:
  9. return 0
  10. leftheight=self.isBalanced(root.left)
  11. rightheight=self.isBalanced(root.right)
  12. if leftheight>=rightheight:
  13. return leftheight+1
  14. else:
  15. return rightheight+1
  16. input_3=TreeNode(3)
  17. input_4=TreeNode(4)
  18. input_5 = TreeNode(5)
  19. input_5.left=input_3
  20. input_5.right=input_4
  21. input_18 = TreeNode(18)
  22. input_all = TreeNode(2)
  23. input_all.left = input_5
  24. input_all.right = input_18
  25. slu_ = Solution()
  26. print (input_all)
  27. t = slu_.isBalanced(input_all)
  28. print (t)

178-求两个字符串的最长公共子串

  1. def initindexs(char, string):
  2. index = []
  3. length = len(string)
  4. for i in range(length):
  5. if char == string[i]:
  6. index.append(i + 1) # 保存相同字符坐标+1的位置
  7. return index
  8. def Substring(str1, str2):
  9. str1_len = len(str1)
  10. str2_len = len(str2)
  11. length = 0
  12. longest = 0
  13. startposition = 0
  14. start = 0
  15. for i in range(str1_len):
  16. start = i
  17. index = initindexs(str1[i], str2)
  18. index_len = len(index)
  19. for j in range(index_len):
  20. end = i + 1
  21. while end < str1_len and index[j] < str2_len and str1[end] == str2[index[j]]: # 保证下标不会超出列表范围
  22. end += 1
  23. index[j] += 1
  24. length = end - start
  25. if length > longest:
  26. longest = length
  27. startposition = start
  28. return startposition, longest
  29. str1 = "pmcdcdfe"
  30. str2 = 'aoccddcdfe'
  31. Substring(str1, str2)
  32. (start, longest) = Substring(str1, str2)
  33. print(start, longest)
  34. for i in range(longest):
  35. print(str1[start + i], end=' ')

179-如何快速计算两个list的交集、并集

  1. #简单的方法:
  2. a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  3. b = [2, 5, 8, 11, 0]
  4. # 交集(intersection)
  5. intersection = [v for v in a if v in b]
  6. # 并集( union)
  7. union = b.extend([v for v in a])
  8. #高效的方法:
  9. # 交集(intersection)
  10. intersection = list(set(a).intersection(set(b)))
  11. # 并集(union)
  12. union = list(set(a).union(set(b)))

180-翻转一个字符串s = “abcdef”

  1. string = 'abcdef'
  2. #第一种方法
  3. def string_reverse1(string):
  4. return string[::-1]
  5. #第二种方法
  6. def string_reverse2(string):
  7. t = list(string)
  8. l = len(t)
  9. for i,j in zip(range(l-1,0,-1),range(1/2)):
  10. t[i],t[j] = t[j],t[i]
  11. return "".join(t)
  12. #第三种方法
  13. def string_reverse3(string):
  14. if len(string) <= 1:
  15. return string
  16. return string_reverse3(string[1:] + string[0])
  17. #第四种方法
  18. from collections import deque
  19. def string_reverse4(string):
  20. d = deque()
  21. d.extendleft(string)
  22. return ''.join(d)
  23. #第五种方法
  24. def string_reverse5(string):
  25. # return ''.join(string[len(string) - i] for i in range(1,len(string) + 1))
  26. return ''.join(string[i] for i in range(len(string) -1 ,-1,-1))
  27. print(string_reverse1(string)) #fedcba
  28. print(string_reverse1(string)) #fedcba
  29. print(string_reverse1(string)) #fedcba
  30. print(string_reverse1(string)) #fedcba
  31. print(string_reverse1(string)) #fedcba

181-判断一个字符串是否为回文字符串(将字符串反转之后,得到的字符串同原字符串,称为回文字符串

  1. s = input("请输入文字: ")
  2. # 反转字符串s
  3. r = s[::-1]
  4. if s == r:
  5. print(s, "是回文")
  6. else:
  7. print(s, "不是回文")
文章知识点与官方知识档案匹配,可进一步学习相关知识
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/72971
推荐阅读
相关标签
  

闽ICP备14008679号