前言
详见前文
目录
目录
基础数据结构
(铺垫)可迭代对象
包括列表,元组,字典,字符串
列表
笔者目前认为列表是最简单好用的数据结构,C没有
a=[element1,element2,...,elementN]
element可以是任意数据、数据结构
列表下标
访问元素使用下标
总合法使用范围[-n,n-1]
[0,n-1]正着用,[-n,-1]倒着用
添加元素(可迭代对象)
末尾添加
a.append()末尾添加单个
a.expend()添加多个(不能是单个数字)
中间插入
a.insert(下标,x)在下标处添加x
删除元素
根据位置删除
del a[idx]建议少用
a.pop(idx)
a.pop()不输入idx默认最后一个
区别:del不返回删除值,pop返回删除值
eg:b=a.pop(1)
根据元素删除
a.remove(x)删掉从左往右第一个x
删除列表所有的x:加个循环和成员运算符in
while x in a:
a.remove(x)
查找元素
a.count(x)计算x出现的次数
a.index(x,start,stop)查找x在[start,stop)列表中第一次出现的位置
start,stop要是不写的话默认是整个列表
注意:index若在[start,stop)没有找到会报错,count不会
其他
a.reverse()将列表前后翻转
len(a)求列表长度
a.clear()清空列表,删库跑路
对列表的操作
列表遍历
for循环
for x in a: 这里a列表作为可迭代对象(for的需要)
xxx
enumerate函数
可以在遍历是同时获取下标idx(只是一个变量可改名)(下标用于循环控制)
enumerate(a,start=y)y默认为0
for idx,x in enumerate(a):同时得到idx和x一一对应
xxx
创建数值列表
list()
a=list(应该是放一个可迭代对象,没看明白英文注释)
eg:a=list(range(5)) a=list([2,3,4])
列表操作符
+连接两个列表:c=a+b
a*x a复制x次:c=a*2
对于纯数字的列表:
sum(a)求列表元素和
max(a)求最大值
min(a)求最小值
列表解析式
基于已有列表通过解析式关系(expression)生成新列表
[expression for member in 已有列表或者可迭代对象名 (if 条件)]
a= [x**2 for x in range(11) if x % 2 == 0]
列表切片
与range()的start end step定义相同,只不过切片可以切所有列表不只是数字
(新列表名=) a[start:end:step]
注意:必须在[ ]内打出一个冒号‘:’
列表复制
和C语言一样若直接b=a则只是给了首地址,ab都对应同一个列表不是复制
真正的复制
a.copy()复制函数
b=a[:]利用切片复制
元组
(劣化版的列表)
元组是创建后不能修改的定死的列表!
元组创建
从[ ]变成() a=(element...)
从list()变成tuple() a=tuple(可迭代对象)
字符串
字符串简介
看成是字符型的列表即可
‘ ’或者" "都可以,与C不同
与列表一样的下标,切片,+,*,len(),in,not in用法
str()强制转化字符串函数
转义字符
\开头,和C语言一样
用于输出直接使用有特殊功能的字符如' "
\n \t
字符编码ord和chr
注意是单个字符,不是对字符串整体编码
一般不用python的unicode码吧,一般用acsll码
ord() 字符->unicode
chr() unicode->字符
字符串常用方法(常用函数)
注意:一般都是后缀a.hanshu()不是hanshu(a)
函数可以复合eg:a=a.title().swapcase()
判断(类的函数)
isalnum() (alnum感觉是all num的简写)是否全是字母或者数字
isalpha()是否全是字母或中文字符
isdigit()是否全是数字
islower()
isupper()
isspace()
istitle()是否首字母大写(标题形式)
转换(类的函数)
字符串本身不变,返回一个新的字符串。也可以a=a.hanshu()
title()标题化函数
lower()
upper()
swapcase()大小写互换
strip([chars])删掉字符串两端的指定字符(不输入chars默认删空格)
lstrip([chars])只删left左边的
rstrip([chars])只删right右边的
replace(old,new[,max])将字符串的old换成new,可以加max限制最多换的个数
center(wide,fillchar)使用fillchar字符将字符串放在wide长度的中间
ljust(wide[,fillchar])同理左对齐,默认fillchar为空格
rjust(wide[,fillchar])右对齐同理
查找(类的函数)
count(str[,beg,end])查找str字符串在字符串出现的次数,也可以加在[beg,end)中查找(count可用于列表)
find(str[,beg,end])同理,查找str是否存在,存在返回第一个该str的下标,不存在返回-1
rfind(str[,beg,end])从右往左的find
index(str[,beg,end])与find功能相同,但是不存在会报错,不推荐
rindex(str[,beg,end])从右往左的index
startswith(substr[,beg,end])专门检测开头的find,返回bool,也可用find替代
endswith(suffix[,beg,end])同理,检测结尾
字符串修改(与列表)
字符串改成列表之后就可以修改了
list(字符串)直接转列表,每个字符一个元素
split()字符串分割成多个字符串作为元素的列表
a.split([str=" ",num=a.len(str)])分隔识别符str默认为空格,num分隔次数默认为-1,最大不限
注意:若分隔字符为字符,分隔时会删去
这里太多了,单独开个链接!
主要有map和joint
format格式化
用format函数调整字符串输出格式
初级格式a='xx{}xx{}...'.format(a1,a2)
占位符{}
{}是占位符,强化的C的%占位符
{}直接使用,则每个占位符按顺序依次填入format中的参数
{数字}通过下标搜索format中参数填入
{参数名}通过名字搜索format中参数填入,注意:这种format()中要参数要同时赋值
eg:a='{price}'.format(price=14.25) age要在括号中赋值
占位符控制数字的输出格式
{:}在占位符中间加冒号
[fill[align]][sign][#][0][width][,][.precision][type]
上面完整的参数表笔者也没有完全搞清楚,讲几个常用功能
[fill[align]][sign][width][.precision][type]
type数据输出类型
(s字符串,d十进制整数,fF十进制浮点数,c转换成unicode,eE科学计数法,b二进制,o八进制,xX十六进制,%显示百分比)
.precision保留小数位数(和C一样)(是四舍五入)
width数的宽度(和C一样)
sign有无符号数
(+表示正负数前都带符号,默认为-只有负数带符号,space表示正数符号位给空格)
fill空白处填充的字符
align数据对齐方式 <左对齐,>右对齐,^居中
b=3.1415926
b='{b:x<+5.1f}'.format(b=b)
print(b)
字典dict
数学中的映射关系
{key1:value1,key2:value2...}
输入一个key(key只能是数字,字符串,元组)(key名不能重复)
就可以找到一个value(value都可以)
创建字典
a=dict( [ [key1,value1],[key2,value2]... ] )注意中括号
或者换成都是两个元素的元组a=dict( [ (key1,value1),(key2,value2)... ] )注意中括号
这里不推荐使用a=dict(key1=value1,...)
还可以a={key1:value1,...}
zip函数与zip数据类型
和map函数一样同理,zip函数返回的是zip数据类型,不能直接print(应该也是首地址)
zip(sequence1,sequence2,...)
把多个序列下标相同的元素组装成元组(不可变),返回一个可迭代对象但是是zip类型
一般zip后用list将zip转换为list,转换一次后zip为空不能再转。
然后用dict()将list转成dict
a=dict(list(zip(keys,value)))
访问字典
通过key得到value,把key看作下标
知道key一定存在时
a[key]返回的是对应的value
key不一定存在时
a.get(key[,x])查key查到返回value查不到默认返回None(可修改为x)
字典基本操作
添加或修改元素
直接利用key value关系
a[key]=value
删除元素
del a[key]
或者a,pop(key)
遍历字典
for加上keys value items(用于遍历二元组(keys,value))
for x in a.keys():
for x in a.value():
for x,y in a.items():
判断是否存在元素
用in 和not in加上keys value items返回bool
x in a.keys()
x in a.value()
(x,y) in a.items()
拷贝字典
和list一样,直接a=b只是加了个别名,控制的是同一个字典
要用copy
b=a,copy()
合并两个字典(字典更新)
a.update(b)把字典b更新给字典a
如果b有a没有的就新增给a
如果b的key在a有,则直接更新对应的value
例题
统计字符串各字母个数
s=input()
Count={}
for c in s:
Count[c]=Count.get(c,0)+1
for k,v in Count.items():
print('{}:{}'.format(k,v))
集合
和数学中的集合概念基本一样
集合内的元素不重复,无序!
只能放不可变的数据:数字,字符串,元组
a={element1,element2...}
创建集合
a={element1,element2...}
set(x)把可迭代对象x转成集合(一般是列表,元组)
set()空集
注意:用a={}创建的是空字典不是空集合
遍历集合
和列表,字典一样用for
for x in a:
其他
a.clear()清空集合
in not in判断是否存在x in a
len(a)集合长度即集合元素个数
集合基本操作
添加元素
a.add(x)
a.update(x)x是元素或者另一个集合
删除元素
a.remove(x)x不存在会报错
a.discard(x)x不存在不会报错
a.pop()随机删除一个
a.clear()清空
判断类方法
集合特有的基本特点
a.isdisjoint(b)判断ab是否不相交(dis不joint相交)
a.issubset(b)判断a是否是b的子集(sub子set集合)
a.issuperset(b)判断a是否是b的超集(b是a的子集)
交集a&b
并集a|b
差集a-b / b-a
对称差集a^b
不推荐用上面四个符号,推荐用下面的函数
b=a.intersection(b1,b2...)b是a,b1,b2...的交集(括号里最少填一个)
b=a.union(b1,b2...)b是a,b1,b2...的并集(括号里最少填一个)
c=a.difference(b)c是a-b的差集
c=a.symmetric_difference(b)c是a,b的对称差集
日期和时间
总结:time相当于计时器,datetime相当于闹钟
time模块
可以获取时间戳,可用于计时
Python用xxx模块需要先import xxx
需要调用时:time+.+功能名称(相比datetime只有一种类型,简单)
时间戳函数:time()
a=time.time()返回a浮点数表示时间戳(第一个time表示调用time模块,第二个是时间戳函数)
睡眠程序:sleep()
time.sleep(x)程序睡眠x秒
获取本地时间
time.localtime():返回本地时间,是一个struct_time对象(就是一个结构体),struct_time对象之间不可加减(因为是结构体)
可以打开struct_time看看
import time
a=time.localtime()
print(type(a))
print(a)
a=time.localtime()[.xxx函数]
自带tm(time的简写)系列函数
.tm_year
.tm_mon
.tm_mday(month day一个月的第几天)
.tm_hour
.tm_min
.tm_sec
.tm_wday(week day一个月的第几天)
.tm_yday(year day一年的第几天)
.tm_isdst夏令时标识
格式化日期
time.strftime(format[,t]):把时间t按照format格式转换,返回一个字符串(time-format格式->str)
如“2024-2-14”字符串
time.strptime(string,format):把字符串按照format格式,返回一个时间(str-format格式->time)
strftime与strptime互逆
import time
t=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
print(type(t))
print(t)
t=time.strptime(t,"%Y-%m-%d %H:%M:%S")
print(type(t))
print(t)
time的format格式
小写字母是缩写,大写字母是完整名称
年月日时分秒%Y %m(month) %d %H(hour) %M(minute) %S(second)
datetime模块
datetime支持日期和时间的运算,包括四种数据
date日期
time时间
datetime日期时间
timedelta时间间隔
date
date与date加减得timedelta
date与timedelta加减得date
date之间支持比较
定义date:
a=datetime.date(年,月,日)
eg:a=datetime.date(2024,2,15)
获取年月日:
a.year
a.month
a.day
a.weekday()周几,周一到周日0-6
time
与date同理
但是time不支持加减,要转换成datetime加减
a=datetime.time(20,42,1)
a.hour a.minute a.second
datetime
同理date,相当于date加上time
a=datetime.datetime(2024,2,15,20,42,1)(可以只填前几个依次识别)
a.year到a.weekday()到a.second全都能用
可以用combine合并date和time到一个datetime
a=datetime.datetime.combine(b,c)
timedelta
时间差
时间差存储单位:days,seconds,microseconds(微秒)
时间差定义时可用单位:weeks,days,hours,minutes,seconds,milliseconds(微秒),microseconds
定义后自动转化为存储单位
eg:a=datetime.timedelta(weeks=1)
与datetime不同:只能输出时间差存储单位a.days这三类
特别地:还可以输出a.total_seconds()全部转化为秒(只有秒有这个快捷函数)
和字符串的互换(格式化)
同理time的
eg:a=datetime.datetime(2024,2,15,20,42,1)
a.strftime(format[,t]):把时间t按照format格式转换,返回一个字符串(time-format格式->str)
如“2024-2-15”字符串
datetime.(四种类型一种).strptime(string,format):把字符串按照format格式,返回一个时间(str-format格式->time)
strftime与strptime互逆
import time
t=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
print(type(t))
print(t)
t=time.strptime(t,"%Y-%m-%d %H:%M:%S")
print(type(t))
print(t)
import datetime
a=datetime.datetime(2024,2,15,20,42,1)
b=a.strftime("%Y %S")
c=datetime.datetime.strftime(a,"%Y %S")
print(b)
print(type(b))
print(c)
print(type(c))
d=datetime.datetime.strptime(c,"%Y %S")
print(d)
print(type(d))
e=a.strptime(c,"%Y %S")#这里不知道为什么a就算不参与转换也能用,虽然我知道a是datetime.datetime型
print(e)
print(type(e))
注意:strptime转换时格式必须完全对应,参数必须用尽(可以先提取一下)
strptime转出来的时间,未给参数的默认为0
当前日期
datetime.date.today()
datetime.datetime.now()(datetime包里的datetime类型)
补充
补充1
小数点精度控制
目前笔者搜到的只有四舍五入的
格式化方法比round更通用,和C类似
print('%.2f'%x) x四舍五入保留两位小数
补充2
可迭代对象和序列的关系
序列是特殊的可迭代对象
可迭代对象是指能够一次返回一个成员的对象,例如列表、字符串、元组、字典和自定义对象。序列是一种特殊的可迭代对象,它支持通过整数索引访问元素,并且定义了len()方法来返回序列的长度。
最后一个补充
求三连!