一、数字
#整型int
作用:年纪,等级,身份证号,qq号等整型数字相关
定义:
age=10 #本质age=int(10)
#浮点型float
作用:薪资,身高,体重,体质参数等浮点数相关
salary=3000.3 #本质salary=float(3000.3)
#二进制,十进制,八进制,十六进制
![]()
#长整形(了解)
在python2中(python3中没有长整形的概念):
>>> num=2L
>>> type(num)
<type 'long'>
#复数(了解,推荐视频:https://www.bilibili.com/video/av26786159)
>>> x=1-2j
>>> x.real
1.0
>>> x.imag
-2.0
其他数字
二、字符串
replace/find/join/strip/startswith/split/upper/lowerformat
template = "i am {name}, age : {age}"
v = template.format(name="alex",age=19}
v = template.format(**{"name":"alex","age":19})
#strip
name='*egon**'
print(name.strip('*'))
print(name.lstrip('*'))
print(name.rstrip('*'))
#lower,upper
name='egon'
print(name.lower())
print(name.upper())
#startswith,endswith
name='alex_SB'
print(name.endswith('SB'))
print(name.startswith('alex'))
#format的三种玩法
res='{} {} {}'.format('egon',18,'male')
res='{1} {0} {1}'.format('egon',18,'male')
res='{name} {age} {sex}'.format(sex='male',name='egon',age=18)
#split
name='root:x:0:0::/root:/bin/bash'
print(name.split(':')) #默认分隔符为空格
name='C:/a/b/c/d.txt' #只想拿到顶级目录
print(name.split('/',1))
name='a|b|c'
print(name.rsplit('|',1)) #从右开始切分
#join
tag=' '
print(tag.join(['egon','say','hello','world'])) #可迭代对象必须都是字符串
#replace
name='alex say :i have one tesla,my name is alex'
print(name.replace('alex','SB',1))
#isdigit:可以判断bytes和unicode类型,是最常用的用于于判断字符是否为"数字"的方法
age=input('>>: ')
print(age.isdigit())
![]()
#find,rfind,index,rindex,count
name='egon say hello'
print(name.find('o',1,3)) #顾头不顾尾,找不到则返回-1不会报错,找到了则显示索引
# print(name.index('e',2,4)) #同上,但是找不到会报错
print(name.count('e',1,3)) #顾头不顾尾,如果不指定范围则查找所有
#center,ljust,rjust,zfill
name='egon'
print(name.center(30,'-'))
print(name.ljust(30,'*'))
print(name.rjust(30,'*'))
print(name.zfill(50)) #用0填充
#expandtabs
name='egon\thello'
print(name)
print(name.expandtabs(1))
#captalize,swapcase,title
print(name.capitalize()) #首字母大写
print(name.swapcase()) #大小写翻转
msg='egon say hi'
print(msg.title()) #每个单词的首字母大写
#is数字系列
#在python3中
num1=b'4' #bytes
num2=u'4' #unicode,python3中无需加u就是unicode
num3='四' #中文数字
num4='Ⅳ' #罗马数字
#isdigt:bytes,unicode
print(num1.isdigit()) #True
print(num2.isdigit()) #True
print(num3.isdigit()) #False
print(num4.isdigit()) #False
#isdecimal:uncicode
#bytes类型无isdecimal方法
print(num2.isdecimal()) #True
print(num3.isdecimal()) #False
print(num4.isdecimal()) #False
#isnumberic:unicode,中文数字,罗马数字
#bytes类型无isnumberic方法
print(num2.isnumeric()) #True
print(num3.isnumeric()) #True
print(num4.isnumeric()) #True
#三者不能判断浮点数
num5='4.3'
print(num5.isdigit())
print(num5.isdecimal())
print(num5.isnumeric())
'''
总结:
最常用的是isdigit,可以判断bytes和unicode类型,这也是最常见的数字应用场景
如果要判断中文数字或罗马数字,则需要用到isnumeric
'''
#is其他
print('===>')
name='egon123'
print(name.isalnum()) #字符串由字母或数字组成
print(name.isalpha()) #字符串只由字母组成
print(name.isidentifier())
print(name.islower())
print(name.isupper())
print(name.isspace())
print(name.istitle())
其他操作
![]()
def capitalize(self) 首字母大写
def casefold(self) 所有变小写,casefold更强,很多未知的也会相应变小写
def center(self, width, fillchar=None)设置宽度,并将内容居中
def count(self, sub, start=None, end=None)去字符串中寻找子序列的出现次数
def encode(self, encoding='utf-8', errors='strict')
def endswith(self, suffix, start=None, end=None)以什么什么结尾
def expandtabs(self, tabsize=8) 断句tabsize的长度
def find(self, sub, start=None, end=None)从开始往后找,找到第一个之后,获取其索引
def format(self, *args, **kwargs)格式化,将一个字符串中的占位符替换为指定的值
def format_map(self, mapping)格式化,传入的值 {"name": 'alex', "a": 19}
def index(self, sub, start=None, end=None)找不到,报错
def isalnum(self)字符串中是否只包含 字母和数字
def isalpha(self)是否是字母,汉字
def isdecimal(self)当前输入是否是数字 2
def isdigit(self)②,2
def isidentifier(self)
def islower(self)
def isnumeric(self)②,2,二
def isprintable(self)
def isspace(self)
def istitle(self)
def isupper(self)
def join(self, iterable)
def ljust(self, width, fillchar=None)
def lower(self)
def lstrip(self, chars=None)
def maketrans(self, *args, **kwargs)
def partition(self, sep)分割为三部分
def replace(self, old, new, count=None)将指定字符串替换为指定字符串
def rfind(self, sub, start=None, end=None)
def rindex(self, sub, start=None, end=None)
def rjust(self, width, fillchar=None)
def rpartition(self, sep)
def rsplit(self, sep=None, maxsplit=-1)
def rstrip(self, chars=None)
def split(self, sep=None, maxsplit=-1)
def splitlines(self, keepends=None)
def startswith(self, prefix, start=None, end=None)
def strip(self, chars=None)
def swapcase(self)
def title(self)
def translate(self, table)
def upper(self)
def zfill(self, width)
# m = str.maketrans("aeiou", "12345")
# new_v = v.translate(m)
字符串函数
三、列表
append/ extend/ insert
索引、切片、循环
#ps:反向步长
l=[1,2,3,4,5,6]
#正向步长
l[0:3:1] #[1, 2, 3]
#反向步长
l[2::-1] #[3, 2, 1]
#列表翻转
l[::-1] #[6, 5, 4, 3, 2, 1]
![]()
"""
列表【有序可变】
作用:多个装备,多个爱好,多门课程,多本书籍等
定义:
[]内可以有多个任意类型的值,逗号分隔
"""
# 创建
li = ['a', 'b', 'cc', 4] # 定义一个列表一般用这种就可以
# li = list(['a','b','cc',4]) # 定义一个列表
# #增加
li.append(5) # #在列表末尾 添加一个元素,li=['a', 'b', 'cc', 4, 5]
li.insert(0, 'g') # #在列表末尾 添加一个元素,li=['g', 'a', 'b', 'cc', 4]
li.extend(['gg', 'kk']) # 添加一个列表['gg','kk'], li=['a', 'b', 'cc', 4, 'gg', 'kk']
# # 删除
aa = li.pop() #******pop 删除的时候要保障元素存在,不然会报错******,
print(li,aa) # 从尾部删除一个元素,并返回删除的元素 ['a', 'b', 'cc'] 4
aa = li.pop(2) # 删除索引为2的元素,并返回删除的元素['a', 'b', 4] cc
aa = li.remove('a') # 从列表中移除,无返回值 'a',['b', 'cc', 4] None
li.clear() # 清空列表[]
del li[-1] # 删除最后一个
# # 修改
li[0] = 'A' # ['A', 'b', 'cc', 4]
# # 查找
print(li.index('a')) # 运行结果0
# 获取该元素,在列表中的索引,(如果列表中有多个相同的元素,只会取找到的第一个元素的索引。
# 当然也可获取某段范围的索引print(liist1.index('d',2,5)))
# 找不到会报错
print(li.count('a')) # 运行结果1 统计列表中有几个a(元素)
# # 其他
li.reverse() # 反转一个列表,li=[4, 'cc', 'b', 'a']
for i in li: # 循环输出列表元素
print(i)
list1 = ["a", "c", "b", "e", "d"]
list1.sort() # 排序
print(list1) # ['a', 'b', 'c', 'd', 'e']
# # python3.x系列的数据类型排序,字符串类型和数字类型不能一起进行排序
list
四、元祖
忽略
索引、切片、循环、元素不能被修改
![]()
"""
元组【有序不可变】
作用:存多个值,对比列表来说,元组不可变(是可以当做字典的key的),主要是用来读
定义:
与列表类型比,只不过[]换成()
"""
t = ('a',) # 元祖只有一个元素时,需要加逗号, 和字符串区分开
t = ('a', 'b', 'b', 'c') # 定义一个元组
t = tuple(('a', 'b', 'b', 'c'))
print(t.index('b')) # 索引出元素第一次出现的位置,还可以指定在某一范围里查找,这里默认在整个元组里查找输出1
print(t.count('b')) # 计算元素出现的次数,这里输出2
print(len(t)) # 输出远组的长度,这里输出4
print(t[1:3]) # 切片 输出('b','b')
for i in t:
print(i) # 循环打印出元组数据
tuple
五、字典
get/ update/ keys/ values/ items
for循环,索引。不可以切片
![]()
"""
字典【无序可变】
作用:存多个值,key-value存取,取值速度快
定义:
key必须唯一,必须是不可变类型,value可以是任意类型
"""
# 创建:
info = {"name": "tom", "age": 18, "gender": "male"} # 本质info=dict({"name":"tom","age":18})
# info=dict(name='tom',age=18,gender='male')
# info=dict([['name','tom'],('age',18)])
# info={}.fromkeys(('name','age','gender'),None) #{'name': None, 'gender': None, 'age': None}
# 增加
info['salary'] = 50000 # {'name': 'tom', 'age': 18, 'salary': 50000, 'gender': 'male'}
# 删除
info.pop('age') # 根据键删除某一元素 d={'Michael': 95, 'Tracy': 85}
info.popitem() # 随机删除
info.clear() # {}
# 修改
info['age'] = '25' # 如果没有该key,则在字典创建新的的的key-value
# 查询
info.get('age') # 根据key获取values,如果不存在返回None,这里输出75
'''
setdefault的功能
1:key存在,则不赋值,key不存在则设置默认值
2:key存在,返回的是key对应的已有的值,key不存在,返回的则是要设置的默认值
'''
print(info.setdefault('age', 50000)) # 18
print(info.setdefault('salary', 50000)) # 50000
print(info) # {'age': 18, 'name': 'tom', 'salary': 50000, 'gender': 'male'}
# 其他
print(len(info)) # 输出字典长度
print('age' in info) # python3 中移除了 has_key,要判断键是否存在用in
for i in info:
print(i) # 循环默认按键输出
for i in info.values(): # 循环按值输出
print(i)
for k, v in info.items(): # 循环按键值输出
print(k, v)
seq = ('Google', 'Runoob', 'Taobao')
seq2 = ('1', '2', '3')
d1 = dict.fromkeys(seq)
d2 = dict.fromkeys(seq,seq2)
print(d1) # {'Google': None, 'Taobao': None, 'Runoob': None}
print(d2) # {'Taobao': ('1', '2', '3'), 'Google': ('1', '2', '3'), 'Runoob': ('1', '2', '3')}
View Code
![]()
def clear(self)
def copy(self)
@staticmethod # known case
def fromkeys(*args, **kwargs)
def get(self, k, d=None)
def items(self)
def keys(self)
def pop(self, k, d=None)
def popitem(self)
def setdefault(self, k, d=None)
def update(self, E=None, **F)
def values(self)
字典函数
![]()
"""
集合【无序可变】
作用:去重,关系运算
定义:
1:每个元素必须是不可变类型(可hash,可作为字典的key)
2:没有重复的元素
3:无序
4:可以包含多个元素,用逗号分割,
"""
a = {1, 2, 3, 4, 5, 6, 7, 8, 9}
b = {1, 3, 9, 10, 11}
a.add(10) # 添加一个元素
a.discard(1) # 删除元素1,不存在的话不报错
a.remove(1) # 删除元素1,不存在的话报错
a.pop() # 随机删除
a.update([1, 8, 34]) # 更新,没有就添加,有就不添加
# 并集
a.union(b)
a | b
# 返回一个新的集合包含a和b的所有元素
# 交集
a.intersection(b)
a & b
# 返回一个新的集合包含a和b的公共元素
# 差集
a.difference(b)
a - b
# 返回一个新的集合,包含a中的元素,但是没有b中的元素
# 对称差集
a.symmetric_difference(b)
print(a ^ b)
# 返回一个新的集合包含 a和b中不重复的元素
集合
六、布尔值
bool()强转成布尔值
None / "" / ()/ {}/ []/ 0 ----> False
七、可变/不可变类型
可变类型:修改变量的值,ID号不变。也就是不可哈希的数据类型
列表,字典,集合
不可变类型:修改变量的值,ID号变化。也就是可哈希的数据类型
字符串,数字,元祖
八、按照访问顺序
顺序访问:字符串,元组,列表
映射关系访问:字典
九、容器
列表,元组,字典
原子:数字,字符串 (只能存放一个元素)
"""
s='abcdefghigk'
print (s[0:3]) #截取第一位到第三位的字符 #abc
print (s[:] )#截取字符串的全部字符 #abcdefghigk
print (s[6:]) #截取第七个字符到结尾 #ghigk
print (s[:-3] )#截取从头开始到倒数第三个字符之前 #abcdefgh
print (s[2]) #截取第三个字符 #c
print (s[-1] )#截取倒数第一个字符 #k
print (s[::-1]) #创造一个与原字符串顺序相反的字符串 #kgihgfedcba
print (s[-3:-1] )#截取倒数第三位与倒数第一位之前的字符 #ig
print (s[-3:]) #截取倒数第三位到结尾 #igk
print (s[0:10:2])#每隔一个,取一个值 #acegi
print (s[0:10:3])#每隔2个,取一个值 #adgg
![]()
对于字典、列表等数据结构,深拷贝和浅拷贝有区别,从字面上来说,可以看出深拷贝可以完全拷贝,浅拷贝则没有完全拷贝。
#字典只有顶级对象(源变了,深浅copy没变)
import copy #导入copy模块
info = {'name':'tom','age':18} #原始字典
info_copy = copy.copy(info) #浅拷贝
info_deep = copy.deepcopy(info) #深拷贝
print(info)
print(info_copy)
print(info_deep)
id(info);id(info_copy);id(info_deep) #3个不同的对象,id不一样
info['age'] = 19 #源变了,深浅copy没变
#字典嵌套可变对象 (源和浅copy变了,深copy没变)
import copy #导入copy模块
info = {'name':'tom','age':18,'job':['it','design']} #原始字典
info_copy = copy.copy(info) #浅拷贝
info_deep = copy.deepcopy(info) #深拷贝
id(info);id(info_copy);id(info_deep) #3个不同的对象,id不一样
info['job'][0] = 'boss' #源和浅copy变了,深copy没变
print(info)#{'age': 18, 'job': ['boss', 'design'], 'name': 'tom'}
print(info_copy)#{'age': 18, 'job': ['boss', 'design'], 'name': 'tom'}
print(info_deep) #{'age': 18, 'job': ['it', 'design'], 'name': 'tom'}
'''
深浅copy都是对源对象的复制,占用不同的内存空间。
如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
如果对象不止一级目录,源做任何改动,都要影响浅拷贝,但不影响深 拷贝
深浅拷贝
# 练习
'''
l = [11,22,33,44,55,66,77,88,99,90]
result = {}
for item in i:
if item < 66:
#
#
if "k1" not in result:
result["k1"] = [item, ] # {"k1":[11,]}
else:
result["k1"].append((item))
elif item > 66:
if "k2" not in result:
result["k2"] = [item, ] # {"k1":[11,]}
else:
result["k2"].append(item)
'''
# 练习13 有两个列表
'''
l1 = [11,22,33]
l2 = [22,33,44]
a.获取内容相同的元素列表
b.获取l1中有,l2中没有的元素列表
c.获取l2中有,l3中没有的元素列表
d.获取l1和l2中内容都不同的元素列表
l1 = [11,22,33]
l2 = [22,33,44]
s1 = set(l1)
s2 = set(l2)
s3 = s1.difference(s2) # s1 中有,S2中没有 {11}
print(s3)
s4 = s2 - s1 # s2中有,s1中没有 {44}
print(s4)
s5 = s1 & s2 # s1 和 s2中相同的元素。 {33, 22}
print(s5)
s5 = s1.symmetric_difference(s2) # s1 和 s2中不同的元素 {11, 44}
print(s5)
'''
# 练习20 用Python开发程序自动计算方案:
'''
公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买100只鸡,其中公鸡,母鸡,小鸡都必须要有
问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱?
gongji = 5
muji = 3
xiaoji = 1/3
for gongji_num in range(1,101): #制作一个循环,求出满足条件的解
for muji_num in range(1,101-gongji_num):
xiaoji_num = 100-gongji_num-muji_num
money = gongji * gongji_num + muji * muji_num + xiaoji * xiaoji_num
if money == 100:
print("公鸡: %d,母鸡: %d,小鸡: %d" % (gongji_num,muji_num,xiaoji_num))
'''
#练习 有1、2、3、4、5、6、7、8。8个数字能组成多少个互不相同且无重复数字的两位数?
#重复的计算用循环去做是比较适合的。先取一个数,循环8次 把值进行判断,如果不同就加进数字列表
'''
nums = []
for i in range(1,9):
for v in range(1,9):
str_num = str(i) + str(v)
num = int(str_num)
if num not in nums and i != v:
nums.append(num)
print(nums)
print(len(nums))
'''
#列表
'''
l = []
print(id(l))
l.append(2) # 9127376 #5064144
print(l)
print(id(l))
l[0] = 5
print(l)
print(id(l))
'''
#数字
'''
age = 1
print(id(age)) # 1834312800
age = 2
print(id(age)) # 1834312816
'''
#元祖
'''
tu = (1,2,3)
print(id(tu)) # 10180288
'''
#字典
# '''
dict = {"name":"alex"}
print(id(dict)) # 5138304
dict["name"] = "qa"
print(id(dict)) # 5138304
#字符串
'''
name = "alex"
id(name) # 4378016
name = "al"
id(name) # 4454400
'''
#集合
'''
set = {1,2,3,4}
id(set)
set.add(5)
id(set)
'''
列表
一.新建列表的方式
1.li = [“a”, ”b”, ”c”, 1, 2, [“a1”]]
2.str.split()
来得到列表, 字符串的内置方法
3.通过用list()直接转成列表,iterable可迭代的对象。
str = “hello world, good morning” ---》li = list(str)
通过range()来生成列表。list(range(10))
list(dict.keys())
list(dict.values())
list(dict.items())
4.列表生成式: [x * 2 for x in range(10)] X一定是可迭代对象的item.得到是一个列表
二.增。增加元素
li.insert(3,“d”) ---> 索引位,元素。将元素插入到索引位。
li.append(“e”) --- > 在列表中追加一个元素。
li.extend(iterable) - --> 拓展列表,用iterable的对象去拓展
三.删。删除元素
li.clear() - --> 清空列表
li.pop() - --> 默认是删除最后一个,删完了之后会返回删除的值
del (li[2]) - --> 删除列表元素
li, remove(value) - --> 删除列表值,参数是元素
四.改。修改元素的值
li[2] = “value” ---> 覆盖掉原值,就修改了原来的值
li.sort() - --> 排序
li.reverse - --> 反转
sorted(li) - --> 生成副本,对副本进行排序,不影响原列表顺序
五.查。查找元素
li.index(value) - --> 元素的索引
li[0] - --> 已知索引,去取元素
li[:2] - --》 取多个元素
li[::-1] - --》reverse
count(value) - --> 会返回value出现的次数
"""
# 生成字典的方式:
'''
1.person = {"name":"alex","age":10}
2.person = dict(name="alex",age=10)
3.keys = [1,2,3,4,5]
{}.fromkeys(keys,[]) # {0: [], 1: [], 2: [], 3: [], 4: []}
4.d = {}
for k,v in iterable:
d[k] = v
'''
# 增加字典
'''
1.直接给key赋值,如果存在,修改value值,不存在就新增键值对(d = {} ---> d["key"] = value)
2.使用dict.setdefault(key,value=0),如果key存在,不修改value值,如果不存在,新增键值对。返回key对应value值。只新增不修改
'''
# 删除
'''
1.dict.pop(k[,d]) # 删除指定key,找到key 就删除键值对,返回value值。 如果找不到key, pop(k,v)给了v值,返回v,没给v,抛出异常
2.dict.popitem() # 删除任意的键值对
3.dict.clear() # 清空字典
4.内置函数del()
'''
# 修改
'''
1.person[key] = value # 没有key的时候新增键值对,已存在的时候,修改值。
2.dict1.update(dict2) 相当于li.extend(li2).用字典2中的k,v去更新字典1.如果不存在,就新增到字典1,如果存在,更新value值
'''
# 查
'''
1.dict[k] # 返回k 对应的v 值,如果找不到k,报错
2.dict.keys() # dict_keys(['a', 'b', 'c', 'd'])
3.dict.values() # dict_values([[], [], [], []])
4.dict.items() # dict_items([('a', []), ('b', []), ('c', []), ('d', [])])
5.dict.get(k,default=None) # 返回k对应的v 值,如果找不到,返回default
'''
# 循环
'''
1.for k,v in dict.items()
2.for k in dict.keys()
3,for v in dict.values()
'''