python入门的120个基础练习


学习永远都是“理论”与“实践”相结合效果最好。

这里有python入门的120个基础练习(1~40),希望对你有用。

01-Hello World

python的语法逻辑完全靠缩进,建议缩进4个空格。 如果是顶级代码,那么必须顶格书写,哪怕只有一个空格也会有语法错误。 下面示例中,满足if条件要输出两行内容,这两行内容必须都缩进,而且具有相同的缩进级别。
1     print('hello world!')
2     
3     if 3 > 0:
4         print('OK')
5         print('yes')
6     
7     x = 3; y = 4   # 不推荐,还是应该写成两行
8     print(x + y)

 

 

02-print

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

 

 

03-基本运算

运算符可以分为:算术运算符、比较运算符和逻辑运算符。优先级是:算术运算符>比较运算符>逻辑运算符。最好使用括号,增加了代码的可读性。

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

 

 

04-input

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

 

 

05-输入输出基础练习

1     username = input('username: ')
2     print('welcome', username)   # print各项间默认以空格作为分隔符
3     print('welcome ' + username)  # 注意引号内最后的空格

 

 

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     
12     py_str = 'python'
13     len(py_str)  # 取长度
14     py_str[0]  # 第一个字符
15     'python'[0]
16     py_str[-1]  # 最后一个字符
17     # py_str[6]  # 错误,下标超出范围
18     py_str[2:4]  # 切片,起始下标包含,结束下标不包含
19     py_str[2:]  # 从下标为2的字符取到结尾
20     py_str[:2]  # 从开头取到下标是2之前的字符
21     py_str[:]  # 取全部
22     py_str[::2]  # 步长值为2,默认是1
23     py_str[1::2]  # 取出yhn
24     py_str[::-1]  # 步长为负,表示自右向左取
25     
26     py_str + ' is good'  # 简单的拼接到一起
27     py_str * 3  # 把字符串重复3遍
28     
29     't' in py_str  # True
30     'th' in py_str  # True
31     'to' in py_str  # False
32     'to' not in py_str  # True

 

 

07-列表基础

列表也是序列对象,但它是容器类型,列表中可以包含各种数据
 1     **alist = [10, 20, 30, 'bob', 'alice', [1,2,3]]
 2     len(alist)
 3     alist[-1]  # 取出最后一项
 4     alist[-1][-1]  # 因为最后一项是列表,列表还可以继续取下标
 5     [1,2,3][-1]  # [1,2,3]是列表,[-1]表示列表最后一项
 6     alist[-2][2]  # 列表倒数第2项是字符串,再取出字符下标为2的字符
 7     alist[3:5]   # ['bob', 'alice']
 8     10 in alist  # True
 9     'o' in alist  # False
10     100 not in alist # True
11     alist[-1] = 100  # 修改最后一项的值
12     alist.append(200)  # 向**列表中追加一项

 

 

08-元组基础

元组与列表基本上是一样的,只是元组不可变,列表可变。
1     atuple = (10, 20, 30, 'bob', 'alice', [1,2,3])
2     len(atuple)
3     10 in atuple
4     atuple[2]
5     atuple[3:5]
6     # atuple[-1] = 100  # 错误,元组是不可变的

 

 

09-字典基础

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

 

 

10-基本判断

单个的数据也可作为判断条件。 任何值为0的数字、空对象都是False,任何非0数字、非空对象都是True。
 1     if 3 > 0:
 2         print('yes')
 3         print('ok')
 4     
 5     if 10 in [10, 20, 30]:
 6         print('ok')
 7     
 8     if -0.0:
 9         print('yes')  # 任何值为0的数字都是False
10     
11     if [1, 2]:
12         print('yes')  # 非空对象都是True
13     
14     if ' ':
15         print('yes')  # 空格字符也是字符,条件为True

 

 

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

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

 

 

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

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

 

 

13-猜数:基础实现

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

 

 

14-成绩分类1

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

 

 

15-成绩分类2

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

 

 

16-石头剪刀布

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

 

 

17-改进的石头剪刀布

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

 

 

18-猜数,直到猜对

 1     import random
 2     
 3     num = random.randint(1, 10)
 4     running = True
 5     
 6     while running:
 7         answer = int(input('guess the number: '))
 8         if answer > num:
 9             print('猜大了')
10         elif answer < num:
11             print('猜小了')
12         else:
13             print('猜对了')
14             running = False

 

 

19-猜数,5次机会

 1     import random
 2     
 3     num = random.randint(1, 10)
 4     counter = 0
 5     
 6     while counter < 5:
 7         answer = int(input('guess the number: '))
 8         if answer > num:
 9             print('猜大了')
10         elif answer < num:
11             print('猜小了')
12         else:
13             print('猜对了')
14             break
15         counter += 1
16     else:  # 循环被break就不执行了,没有被break才执行
17         print('the number is:', num)

 

 

20-while循环,累加至100

因为循环次数是已知的,实际使用时,建议用for循环
1     sum100 = 0
2     counter = 1
3     
4     while counter < 101:
5         sum100 += counter
6         counter += 1
7     
8     print(sum100)

 

 

21-while-break

break是结束循环,break之后、循环体内代码不再执行。
1     while True:
2         yn = input('Continue(y/n): ')
3         if yn in ['n', 'N']:
4             break
5         print('running...')

 

 

22-while-continue

计算100以内偶数之和。
continue是跳过本次循环剩余部分,回到循环条件处。
    sum100 = 0
    counter = 0
    
    while counter < 100:
        counter += 1
        # if counter % 2:
        if counter % 2 == 1:
            continue
        sum100 += counter
    
    print(sum100)

 

 

23-for循环遍历数据对象

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

 

 

24-range用法及数字累加

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

 

 

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

列表中先给定两个数字,后面的数字总是前两个数字之和。
1     fib = [0, 1]
2     
3     for i in range(8):
4         fib.append(fib[-1] + fib[-2])
5     
6     print(fib)

 

 

26-九九乘法表

 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     
 6     # i=1 ->j: [1]
 7     # i=2 ->j: [1,2]
 8     # i=3 ->j: [1,2,3]
 9     #由用户指定相乘到多少
10     n = int(input('number: '))
11     
12     for i in range(1, n + 1):
13         for j in range(1, i + 1):
14             print('%s*%s=%s' % (j, i, i * j), end=' ')
15         print()

 

 

27-逐步实现列表解析

 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)]

 

 

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

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

 

 

29-文件对象基础操作

 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     data = f.read(4)  # 读4字节
13     f.readline()  # 读到换行符\n结束
14     f.readlines()  # 把每一行数据读出来放到列表中
15     f.close()
16     
17     ################################
18     f = open('/tmp/passwd')
19     for line in f:
20         print(line, end='')
21     f.close()
22     
23     ##############################
24     f = open('图片地址', 'rb')  # 打开非文本文件要加参数b
25     f.read(4096)
26     f.close()
27     
28     ##################################
29     f = open('/tmp/myfile', 'w')  # 'w'打开文件,如果文件不存在则创建
30     f.write('hello world!\n')
31     f.flush()  # 立即将缓存中的数据同步到磁盘
32     f.writelines(['2nd line.\n', 'new line.\n'])
33     f.close()  # 关闭文件的时候,数据保存到磁盘
34     
35     ##############################
36     with open('/tmp/passwd') as f:
37         print(f.readline())
38     
39     #########################
40     f = open('/tmp/passwd')
41     f.tell()  # 查看文件指针的位置
42     f.readline()
43     f.tell()
44     f.seek(0, 0)  # 第一个数字是偏移量,第2位是数字是相对位置。
45                   # 相对位置0表示开头,1表示当前,2表示结尾
46     f.tell()
47     f.close()

 

 

30-拷贝文件

拷贝文件就是以r的方式打开源文件,以w的方式打开目标文件,将源文件数据读出后,写到目标文件。
以下是【不推荐】的方式,但是可以工作:
1     f1 = open('/bin/ls', 'rb')
2     f2 = open('/root/ls', 'wb')
3     
4     data = f1.read()
5     f2.write(data)
6     
7     f1.close()
8     f2.close()

 

 

31-拷贝文件

每次读取4K,读完为止:
 1     src_fname = '/bin/ls'
 2     dst_fname = '/root/ls'
 3     
 4     src_fobj = open(src_fname, 'rb')
 5     dst_fobj = open(dst_fname, 'wb')
 6     
 7     while True:
 8         data = src_fobj.read(4096)
 9         if not data:
10             break
11         dst_fobj.write(data)
12     
13     src_fobj.close()
14     dst_fobj.close()

 

 

32-位置参数

注意:位置参数中的数字是字符形式的
1     import sys
2     
3     print(sys.argv)  # sys.argv是sys模块里的argv列表
4     
5     # python3 position_args.py
6     # python3 position_args.py 10
7     # python3 position_args.py 10 bob

 

 

33-函数应用-斐波那契数列

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

 

 

34-函数-拷贝文件

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

 

 

35-函数-九九乘法表

1     def mtable(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     
7     mtable(6)
8     mtable(9)

 

 

36-模块基础

每一个以py作为扩展名的文件都是一个模块。
 1 star.py:
 2 
 3 
 4     hi = 'hello world!'
 5     
 6     def pstar(n=50):
 7         print('*' * n)
 8     
 9     if __name__ == '__main__':
10         pstar()
11         pstar(30)
12     在call_star.py中调用star模块:
13     
14     import star
15     
16     print(star.hi)
17     star.pstar()
18     star.pstar(30)

 

 

37-生成密码/验证码

此文件名为: randpass.py
思路:
1、设置一个用于随机取出字符的基础字符串,本例使用大小写字母加数字
2、循环n次,每次随机取出一个字符
3、将各个字符拼接起来,保存到变量result中
 1     from random import choice
 2     import string
 3     
 4     all_chs = string.ascii_letters + string.digits  # 大小写字母加数字
 5     
 6     def gen_pass(n=8):
 7         result = ''
 8     
 9         for i in range(n):
10             ch = choice(all_chs)
11             result += ch
12     
13         return result
14     
15     if __name__ == '__main__':
16         print(gen_pass())
17         print(gen_pass(4))
18         print(gen_pass(10))

 

 

38-序列对象方法

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

 

 

39-序列对象方法2

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

 

 

40-字符串方法

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

 

41-字符串格式化

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

 

 

42-shutil模块常用方法

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

 

 

43-练习:生成文本文件

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

 

 

44-列表方法

 1     alist = [1, 2, 3, 'bob', 'alice']
 2     alist[0] = 10
 3     alist[1:3] = [20, 30]
 4     alist[2:2] = [22, 24, 26, 28]
 5     alist.append(100)
 6     alist.remove(24)  # 删除第一个24
 7     alist.index('bob')  # 返回下标
 8     blist = alist.copy()  # 相当于blist = alist[:]
 9     alist.insert(1, 15)  # 向下标为1的位置插入数字15
10     alist.pop()  # 默认弹出最后一项
11     alist.pop(2) # 弹出下标为2的项目
12     alist.pop(alist.index('bob'))
13     alist.sort()
14     alist.reverse()
15     alist.count(20)  # 统计20在列表中出现的次数
16     alist.clear()  # 清空
17     alist.append('new')
18     alist.extend('new')
19     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-生成密码/验证码》
 1     import subprocess
 2     import sys
 3     from randpass import gen_pass
 4     
 5     def adduser(username, password, fname):
 6         data = """user information:
 7     %s: %s
 8     """
 9         subprocess.call('useradd %s' % username, shell=True)
10         subprocess.call(
11             'echo %s | passwd --stdin %s' % (password, username),
12             shell=True
13         )
14         with open(fname, 'a') as fobj:
15             fobj.write(data % (username, password))
16     
17     if __name__ == '__main__':
18         username = sys.argv[1]
19         password = gen_pass()
20         adduser(username, password, '/tmp/user.txt')
21     # python3 adduser.py john

 

 

 

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

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

 

 

48-实现Linux系统中unix2dos功能

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

 

 

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

\r是回车不换行
 1     import time
 2     
 3     length = 19
 4     count = 0
 5     
 6     while True:
 7         print('\r%s@%s' % ('#' * count, '#' * (length - count)), end='')
 8         try:
 9             time.sleep(0.3)
10         except KeyboardInterrupt:
11             print('\nBye-bye')
12             break
13         if count == length:
14             count = 0
15         count += 1

 

 

 

50-字典基础用法

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

 

 

51-字典常用方法

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

 

 

52-集合常用方法

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

 

 

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

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

 

 

 

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

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

 

 

 

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

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

 

 

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

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

 

57-os模块常用方法

 1     import os
 2     
 3     os.getcwd()  # 显示当前路径
 4     os.listdir()  # ls -a
 5     os.listdir('/tmp')  # ls -a /tmp
 6     os.mkdir('/tmp/mydemo')  # mkdir /tmp/mydemo
 7     os.chdir('/tmp/mydemo')  # cd /tmp/mydemo
 8     os.listdir()
 9     os.mknod('test.txt')  # touch test.txt
10     os.symlink('/etc/hosts', 'zhuji')  # ln -s /etc/hosts zhuji
11     os.path.isfile('test.txt')  # 判断test.txt是不是文件
12     os.path.islink('zhuji')  # 判断zhuji是不是软链接
13     os.path.isdir('/etc')
14     os.path.exists('/tmp')  # 判断是否存在
15     os.path.basename('/tmp/abc/aaa.txt')
16     os.path.dirname('/tmp/abc/aaa.txt')
17     os.path.split('/tmp/abc/aaa.txt')
18     os.path.join('/home/tom', 'xyz.txt')
19     os.path.abspath('test.txt')  # 返回当前目录test.txt的绝对路径

 

 

58-pickle存储器

 1     import pickle
 2     """以前的文件写入,只能写入字符串,如果希望把任意数据对象(数字、列表等)写入文件,
 3     取出来的时候数据类型不变,就用到pickle了
 4     """
 5     
 6     # shop_list = ["eggs", "apple", "peach"]
 7     # with open('/tmp/shop.data', 'wb') as fobj:
 8     #     pickle.dump(shop_list, fobj)
 9     
10     with open('/tmp/shop.data', 'rb') as fobj:
11         mylist = pickle.load(fobj)
12     
13     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('invalid number')
 7     except ZeroDivisionError:
 8         print('0 not allowed')
 9     except KeyboardInterrupt:
10         print('Bye-bye')
11     except EOFError:
12         print('Bye-bye')
13     
14     print('Done')

 

 

60-异常处理完整语法

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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM