练习二:设计一个函数返回给定文件名的后缀名。
第一种:
def get_suffix(filename): 获取文件名的后缀名 :param filename: 文件名 :return: 文件的后缀名 index = filename.rfind('.') return filename[index+1:] if index >0 else '' print(get_suffix('zhan.pdf'))
第二种:
from os.path import splitext def get_suffix(filename): return splitext(filename)[1][1:] print(get_suffix('zhan.pdf'))
练习3:在终端中显示跑马灯(滚动)文字。
说明:实现跑马灯文字的原理非常简单,
把当前字符串的第一个字符放到要输出的内容的最后面,
把从第二个字符开始后面的内容放到要输出的内容的最前面,
通过循环重复这个操作,就可以看到滚动起来的文字。
两次循环之间的间隔可以通过time模块的sleep函数来实现,
而清除屏幕上之前的输出可以使用os模块的system函数调用系统清屏命令来实现。
import os import time content = '北 京 欢 迎 你 为 你 开 天 辟 地 ' while True: # Windows清除屏幕上的输出 # os.system('cls') # macOS清除屏幕上的输出 os.system('clear') print(content) # 休眠0.2秒(200毫秒) time.sleep(0.2) content = content[1:] + content[0]
将相对独立且重复出现的功能封装成函数
常用数据结构之列表
将一颗色子掷6000次,统计每个点数出现的次数.
import random f1 = 0 f2 = 0 f3 = 0 f4 = 0 f5 = 0 f6 = 0 for i in range(6000): face = random.randint(1, 6) if face==1: f1=f1+1 if face==2: f2=f2+1 if face==3: f3=f3+1 if face==4: f4=f4+1 if face==5: f5=f5+1 if face==6: f6=f6+1 print(f'1点出现了{f1}次') print(f'2点出现了{f2}次') print(f'3点出现了{f3}次') print(f'4点出现了{f4}次') print(f'5点出现了{f5}次') print(f'6点出现了{f6}次')
定义和使用列表
在Python中,列表是由一系元素按特定顺序构成的数据序列,这样就意味着定义一个列表类型的变量,可以保存多个数据,而且允许有重复的数据。跟上一课我们讲到的字符串类型一样,列表也是一种结构化的、非标量类型,操作一个列表类型的变量,除了可以使用运算符还可以使用它的方法。
items1 = [35, 12, 99, 68, 55, 87] print(items1) items2 = ['Python', 'Java', 'Go', 'Kotlin'] print(items2)
list函数将其他序列变成列表
items1 = list(range(1, 10)) print(items1) # [1, 2, 3, 4, 5, 6, 7, 8, 9] items2 = list('hello') print(items2) # ['h', 'e', 'l', 'l', 'o']
列表是一种可变数据类型,也就是说列表可以添加元素、删除元素、更新元素,这一点跟我们上一课讲到的字符串有着鲜明的差别。字符串是一种不可变数据类型,也就是说对字符串做拼接、重复、转换大小写、修剪空格等操作的时候会产生新的字符串,原来的字符串并没有发生任何改变。
列表的运算符
items1 = [35, 12, 99, 68, 55, 87]
items2 = [45, 8, 29]
# 列表的拼接 items3 = items1 + items2 print(items3) # [35, 12, 99, 68, 55, 87, 45, 8, 29] # 列表的重复 items4 = ['hello'] * 3 print(items4) # ['hello', 'hello', 'hello'] # 列表的成员运算 print(100 in items3) # False print('hello' in items4) # True # 获取列表的长度(元素个数) size = len(items3) print(size) # 9 # 列表的索引 print(items3[0], items3[-size]) # 35 35 items3[-1] = 100 print(items3[size - 1], items3[-1]) # 100 100 # 列表的切片 print(items3[:5]) # [35, 12, 99, 68, 55] print(items3[4:]) # [55, 87, 45, 8, 100] print(items3[-5:-7:-1]) # [55, 68] print(items3[::-2]) # [100, 45, 55, 99, 35] # 列表的比较运算 items5 = [1, 2, 3, 4] items6 = list(range(1, 5)) # 两个列表比较相等性比的是对应索引位置上的元素是否相等 print(items5 == items6) # True items7 = [3, 2, 1] # 两个列表比较大小比的是对应索引位置上的元素的大小 print(items5 <= items7) # True
列表元素的遍历
如果想逐个取出列表中的元素,可以使用for循环的,有以下两种做法。
方法一:
items = ['Python', 'Java', 'Go', 'Kotlin'] for index in range(len(items)): print(items[index])
方法二:
items = ['Python', 'Java', 'Go', 'Kotlin'] for item in items: print(item)
修改掷筛子:
import random counters = [0] * 6 for _ in range(6000): face = random.randint(1, 6) counters[face - 1] += 1 for face in range(1, 7): print(f'{face}点出现了{counters[face - 1]}次')
添加和删除元素append,insert,remove,pop,clear,del
items = ['Python', 'Java', 'Go', 'Kotlin'] # 使用append方法在列表尾部添加元素 items.append('Swift') print(items) # ['Python', 'Java', 'Go', 'Kotlin', 'Swift'] # 使用insert方法在列表指定索引位置插入元素 items.insert(2, 'SQL') print(items) # ['Python', 'Java', 'SQL', 'Go', 'Kotlin', 'Swift'] # 删除指定的元素 items.remove('Java') print(items) # ['Python', 'SQL', 'Go', 'Kotlin', 'Swift'] # 删除指定索引位置的元素 items.pop(0) items.pop(len(items) - 1) print(items) # ['SQL', 'Go', 'Kotlin'] # 清空列表中的元素 items.clear() print(items) # [] items = ['Python', 'Java', 'Go', 'Kotlin'] del items[1] print(items) # ['Python', 'Go', 'Kotlin']
元素位置和次数index,count
items = ['Python', 'Java', 'Java', 'Go', 'Kotlin', 'Python'] # 查找元素的索引位置 print(items.index('Python')) # 0 print(items.index('Python', 2)) # 5 # 注意:虽然列表中有'Java',但是从索引为3这个位置开始后面是没有'Java'的 print(items.index('Java', 3)) items = ['Python', 'Java', 'Java', 'Go', 'Kotlin', 'Python'] # 查找元素出现的次数 print(items.count('Python')) # 2 print(items.count('Go')) # 1 print(items.count('Swfit')) # 0
元素排序和反转 sort,reverse
items = ['Python', 'Java', 'Go', 'Kotlin', 'Python'] # 排序 items.sort() print(items) # ['Go', 'Java', 'Kotlin', 'Python', 'Python'] # 反转 items.reverse() print(items) # ['Python', 'Python', 'Kotlin', 'Java', 'Go']
列表的生成式
# 创建一个由1到9的数字构成的列表 items1 = [] for x in range(1, 10): items1.append(x) print(items1) # 创建一个由'hello world'中除空格和元音字母外的字符构成的列表 items2 = [] for x in 'hello world': if x not in ' aeiou': items2.append(x) print(items2) # 创建一个由个两个字符串中字符的笛卡尔积构成的列表 items3 = [] for x in 'ABC': for y in '12': items3.append(x + y) print(items3)
通过生成式创建列表
# 创建一个由1到9的数字构成的列表
强烈建议用生成式语法来创建列表
items1 = [x for x in range(1, 10)] print(items1) # [1, 2, 3, 4, 5, 6, 7, 8, 9] # 创建一个由'hello world'中除空格和元音字母外的字符构成的列表 items2 = [x for x in 'hello world' if x not in ' aeiou'] print(items2) # ['h', 'l', 'l', 'w', 'r', 'l', 'd'] # 创建一个由个两个字符串中字符的笛卡尔积构成的列表 items3 = [x + y for x in 'ABC' for y in '12'] print(items3) # ['A1', 'A2', 'B1', 'B2', 'C1', 'C2']
嵌套的列表
scores = [[0] * 3] * 5 print(scores) # [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
# 嵌套的列表需要多次索引操作才能获取元素
scores[0][0] = 95 print(scores) # [[95, 0, 0], [95, 0, 0], [95, 0, 0], [95, 0, 0], [95, 0, 0]] scores = [[0] * 3 for _ in range(5)] scores[0][0] = 95 print(scores) # [[95, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
Python中的列表底层是一个可以动态扩容的数组,列表元素在内存中也是连续存储的