日期:2021年1月24日
今天是学习Python的第七天,粗略看了一下,今天的内容太多了,没学过数据结构,还有练习也是有一些没使用过的模块,啃了好久,希望后面不会那么快忘记。
学习用的教材是GitHub上骆昊编写的《Python - 100天从新手到大师》
所有编写的源代码均放在GitHub上:https://github.com/svip886/Python_learning
一、字符串的使用规则
-
使用一对单引号或双引号将字符串内容包起来。
-
在字符串中使用
\
来表示转义-
常用符号:
\n
换行符、\t
水平制表符、\\
表示“\” -
使用八进制或十六进制表示字符,例如
\145
表示e,x45
表示E -
Unicode字符,例如
\u54c8\u54c8\u54c8
表示的就是“哈哈哈” -
不转义:在引号开始前位置加一个
r
s=r'\n hello,world\t' print(s)
💡 感觉上好像只有符号更常用,其他作为了解吧。
-
-
字符串的运算
-
加法
+
:使用+
号对字符串进行拼接 -
重复
*
:'hello'*3
表示重复3次hello,即hellohellohello -
成员运算:使用
in
或not in
来判断一个字符串是否包含另一个字符串s='hello world' print('hi' in s) # False print('hi' not in s) # True
-
切片运算:使用
[]
和[:]
从字符串提取出某个字符或某些字符s='hello world' # 指定下标位置的字符 print(s[1]) # c # 切片:从指定的开始索引到指定的结束索引 print(s[2:5]) # llo print(s[2:]) # llo world print(s[2::2]) # lowrd 从s[2]开始,每2个位置取一次 print(s[::2]) # hlowrd 默认从第一位,即s[0]开始 print(s[::-1]) # dlrow olleh 负号反顺序取位 print(s[-3:-1]) # rl 从-3取到-1
💡 注意,到目前为止,在Python内所有的范围区间,均为左边闭区间,右边开区间
-
-
其他对字符串的操作函数(
str1='hello,world!'
)函数名 作用 使用示例 返回值 len 计算字符串长度 len(str1)
12 capitalize 字符串首字母大写 str1.capitalize()
Hello,world! title 每个单词首字母大写 str1.title()
Hello,World! upper 字符串全部大写 str1.upper()
HELLO,WORLD! find 寻找子串位置 str1.find('or')
7 index 与find类似但找不到子串会引发异常 str1.index('or')
7 startswith 判断是否以指定字符串开头 str1.startswith('He')
False endswith 判断是否以指定字符串结尾 str1.endswith('d!')
True center 以指定的宽度居中并在两侧填充指定字符 str1.center(14,'*')
*hello,world! * rjust 以指定的宽度右置并在左侧填充指定字符 str1.rjust(14,'*')
**hello,world! isdigit 判断是否以数字构成 str1.isdigit()
False isalpha 判断是否以字母构成 str1.isalpha()
False isalnum 判断是否以数字和字母构成 str1.isalnum()
False(因为有符号) strip 去除字符串两边的空格 str1.strip()
hello,world! 💡
index
的功能和find差不多,而且找不到会报错,所以还是用find
好一些
二、列表
我的理解:可以把列表当做一个有序容器,容器可以存很多不同的元素,需要的时候直接取用。列表很多运算和字符串是相同的
-
列表的定义、遍历以及下标运算
-
定义:列表以中括号
[]
包围,不同元素以逗号,
隔开 -
遍历(采用for循环)
-
直接遍历:
for x in list1
-
下标遍历:利用
len()
函数取列表数量为循环范围 -
enumerate函数处理列表:
enumerate(list1)
会同时返回元素索引和值,应使用两个变量来储存,for n,x inenumerate(list1)
。
-
-
-
元素的操作
-
添加元素
-
末位添加:
list1.append(200)
-
定位插入:
list1.insert(1,400)
注意1是第2个
-
-
合并列表:直接使用加法
+
,list3=list1+list2
-
删除元素
-
查找删除:
list1.remove(3)
,如果该元素不在列表中,会引起程序异常,所以一边需要加个判断条件if 3 in list1
-
定位删除:
list.pop(2)
-
-
清空列表元素:
list1.clear()
💡 列表也支持切片操作,使用方法和字符串相同。
-
-
列表排序
list1 = ['orange', 'apple', 'zoo', 'internationalization', 'blueberry'] list2 = sorted(list1) # sorted函数返回列表排序后的拷贝不会修改传入的列表 # 函数的设计就应该像sorted函数一样尽可能不产生副作用 list3 = sorted(list1, reverse=True) # 通过key关键字参数指定根据字符串长度进行排序而不是默认的字母表顺序 list4 = sorted(list1, key=len) print(list1) print(list2) print(list3) print(list4) # 给列表对象发出排序消息直接在列表对象上进行排序 list1.sort(reverse=True) print(list1)
-
生成式和生成器生成列表
-
生成式:直接使用内存空间生成,
f=[x for x in range(1,10)]
-
生成器:每次使用时运算一次,
f=(x for x in range(1,10))
💡 生成式占内存,但更快;生成器省时间,但更慢。使用时权衡利弊,注意生成式用中括号
[]
,生成器用小括号()
-
-
元组
元组和列表一样,唯一的差别在于其元素无法进行更改。
-
定义:和列表一样,但不使用中括号,用小括号,
t=('paranoid',123,'svip886cn')
-
列表转换为元组:使用关键字
touple(t)
-
使用元组的好处:
-
在项目中尤其多线程环境,使用元组避免因对象修改造成的程序错误,状态不变节省处理同步化开销,方便共享。
-
创建时间和占用空间优于列表。
-
-
三、集合
集合的概念和数学的集合是一样,且可进行交集、并集、差集等运算。注意,集合中的元素不重复,所以有两个重复的元素的时候,会只显示一个。
-
集合的定义:使用大括号
{}
包围元素 -
元素的操作:
-
添加元素:
-
单个元素使用add,
s.add(5)
-
多个元素使用updata,`s.updata([7,8])
-
-
删除元素:
-
remove:删除指定元素,
s.remove(3)
-
discord:和remove一样,不同在于可以删除没有的元素,找不到元素不会报错
-
pop:只保留集合的第一个元素(最小),
s.pop()
💡 remove和discord都只是删除单个元素,所以如果需要删除多个元素,可以使用循环。
-
-
-
集合的运算:
- 交集
&
- 并集
|
- 差集
-
- 对称差运算
^
- 判断子集和超级
>=
<=
- 交集
四、字典
字典同样是可变容器,储存任意类型对象,和列表集合的不同之处在于每个元素。不同之处在于,每个元素都是由一个键和一个值组成的“键值对”,可以当做每个元素都有对应的编码,就像ASCII字符。
# 创建字典的字面量语法
scores = {'骆昊': 95, '白元芳': 78, '狄仁杰': 82}
print(scores)
# 创建字典的构造器语法
items1 = dict(one=1, two=2, three=3, four=4)
# 通过zip函数将两个序列压成字典
items2 = dict(zip(['a', 'b', 'c'], '123'))
# 创建字典的推导式语法
items3 = {num: num ** 2 for num in range(1, 10)}
print(items1, items2, items3)
# 通过键可以获取字典中对应的值
print(scores['骆昊'])
print(scores['狄仁杰'])
# 对字典中所有键值对进行遍历
for key in scores:
print(f'{key}: {scores[key]}')
# 更新字典中的元素
scores['白元芳'] = 65
scores['诸葛王朗'] = 71
scores.update(冷面=67, 方启鹤=85)
print(scores)
if '武则天' in scores:
print(scores['武则天'])
print(scores.get('武则天'))
# get方法也是通过键获取对应的值但是可以设置默认值
print(scores.get('武则天', 60))
# 删除字典中的元素
print(scores.popitem())
print(scores.popitem())
print(scores.pop('骆昊', 100))
# 清空字典
scores.clear()
print(scores)
五、练习
-
在屏幕上显示跑马灯文字
import os import time def main(): string="抬头吧黑暗过后会是晨曦,怀着乐观总有转机······" while 1: os.system('cls') # 清理屏幕输出 print(string) time.sleep(0.2) # 延时0.2s string=string[1:]+string[0] if __name__=='__main__': main()
-
设计一个函数产生指定长度的验证码,验证码由大小写字母和数字构成
def yzm(num=4): s='qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789' y='' for n in range(num): y+=s[randint(0,len(s)-1)] return y
-
设计一个函数返回给定文件名的后缀名
def get_suffix(filename): point=filename.find('.') if point>0: return filename[point+1:len(filename)] else: return '无后缀名'
-
设计一个函数返回传入的列表中最大和第二大元素的值
def m(list1): m1=list1[0] m2=list1[0] for n in range(1,len(list1)): if m2<list1[n]: m2=list1[n] if m1<m2: m1,m2=m2,m1 return m1,m2
-
计算指定的年月日是这一年的第几天
def is_leap_year(year): return year % 4 == 0 and year % 100 != 0 or year % 400 == 0 def which_day(year, month, date): days_of_month = [ [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] ][is_leap_year(year)] total = 0 for index in range(month - 1): total += days_of_month[index] return total + date def main(): print(which_day(1980, 11, 28)) print(which_day(1981, 12, 31)) print(which_day(2018, 1, 1)) print(which_day(2016, 3, 1)) if __name__ == '__main__': main()
-
打印杨辉三角
def main(): num = int(input('Number of rows: ')) yh = [[]] * num for row in range(len(yh)): yh[row] = [None] * (row + 1) for col in range(len(yh[row])): if col == 0 or col == row: yh[row][col] = 1 else: yh[row][col] = yh[row - 1][col] + yh[row - 1][col - 1] print(yh[row][col], end='\t') print() if __name__ == '__main__': main()