Python 数据类型


一、数字
#整型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()
'''
 
posted @ 2020-08-06 16:52  正在学Python  阅读(182)  评论(0编辑  收藏  举报