python基础——数据类型

基础知识

数据类型

数据类型脑图

所谓可变与不可变,即为内存地址不变的情况下值是否可变
以字符串为例:字符串类型看似是可变的,只需要重新赋值即可,但是每次赋值都会创建一个全新的对象,都是指向一个新的地址,并不会改变原有地址上的值,所以其实是不可变的
下面通过id()函数验证一下。通过输出结果可以看出字符串重新赋值后内存地址是改变的

   a = 'hello'
   print(id(a)) # 140204376011888
   a = 'world'
   print(id(a)) # 140204913431344
   b = [1,2,3,4,5,6,7]
   print(id(b)) # 140204913422144
   b.append(8)
   print(id(b)) # 140204913422144

变量赋值

不需要声明变量类型变量名 = 值
每个变量在使用前必须赋值,只有被赋值之后的变量才会在内存中被创建,变量被赋值之后会自动解析其类型,若想看变量的类型可通过type()函数来查询对应的数据类型
python亦可支持多变量赋值

  1. 多变量同值 变量1=变量2=变量3=值
  2. 多变量不同值 变量1,变量2,变量3=值1,值2,值3⚠️变量的数量需和值的数量相对应

字符串

字符串类型使用单引号或者双引号括起来,其中可能会用转义字符\进行转译,当外层和内层都用到’时需要将内层的单引号用转义字符\进行转译print('hello \'world\'')输出为:【hello ‘world’】

  • ➕是字符串的连接符
  • 星号*表示复制当前字符串
  • 截取字符串的语法为:变量[开始下标,结束下标]

常用方法:

方法名参数方法用途例子
capitalize返回首字母大写的字符串格式hello’.capitalize()输出结果为:Hello
casefold将所有大写字母转为小写‘HELLOWORLD’.casefold()输出结果为:helloworld
centerwidth所返回字符串的长度,若小于等于原有字符串长度则返回原有字符串,fillchar指定字符使用指定的字符(默认为空格)作为填充字符使字符串居中对齐。返回居中的字符串‘hello world’.center(13,’,’)输出结果为:,hello world,
countvalue元素、start开始索引、end结束索引返回指定元素在字符串中出现的次数。‘hello world’.count(‘o’)输出结果为:2
startswithvalue元素、start开始索引、end结束索引如果以指定值开头的字符串,则返回 true。‘hello world’.startswith('hello world’输出结果为:True
endswithvalue元素、start开始索引、end结束索引如果字符串以指定元素结尾,则返回 True,否则返回 False。‘hello world’.endswith('hello world’输出结果为:True
expandtabssize制表符代表的空格数量,一般为8expandtabs() 方法将制表符的大小设置为指定的空格数。‘\thello world’.expandtabs(8)输出结果为: hello world
findvalue元素、start开始下标、end结束下标查找并返回指定元素首次出现的下标,如果找不到则返回-1。和index方法的区别为index如果找不到会报错print(’\thello world’.find(‘l’))输出结果为:3
formatvalue1、value2……格式化字符串,给占位符赋值。占位符使用大括号 {} 定义。1. {变量名}2. {0}、{1}3. {}print(‘hello {name},you are {age} years old’.format(name = ‘zhangsan’, age = 20));print(‘hello {0},you are {1} years old’.format(‘zhangsan’, 20));print(‘hello {},you are {} years old’.format(‘zhangsan’,20))输出结果为:hello zhangsan,you are 20 years old
indexvalue元素、start开始下标、end结束下标查找并返回指定元素首次出现的下标,如果找不到则报错print(’\thello world’.index(‘l’))输出结果为:3
isalnum如果字符串中的所有元素都是字母数字,则返回 True。计算机中存储汉字的方式是汉字内码,所以带有中文也是满足条件的。‘hello啊401’.isalnum()输出结果为:True
isalpha如果字符串中的所有元素都是字母,则返回 True。‘hello啊’.isalpha()输出结果为:True
isdigit如果字符串中的所有元素都是数字,则返回 True。‘243546.13’.isdigit()输出结果为:False原因:有点
isidentifier如果字符串是标识符,则返回 True。‘dhd_ads’.isidentifier()输出结果为:True
islower如果字符串中的所有元素都是小写,则返回 True。可以有中文特殊符号等,只要没大写都为true。不检查数字、符号和空格,仅检查字母字符。‘cdjdhsjwwe啊。.232’.islower()输出结果为:True
isnumeric如果字符串中的所有都是数,则返回 True。‘2324231231’.isnumeric()输出结果为:True
isprintable如果字符串中的所有的元素都是可打印的,则返回 True。不可打印的字符可以是回车和换行符。print(’\n’.isprintable())输出结果为:False
isspace如果字符串中的所有字符都是空白字符,则返回 True。‘\t’.isspace()输出结果为:True.若为空字符串则为false
istitle如果字符串遵循标题规则,则返回 True。如果文本中的所有单词均以大写字母开头,而单词的其余部分均为小写字母,则 istitle() 方法返回 True。否则返回 False。‘哈喽,Hello World Nihaoya’.istitle()输出结果为:True
isupper如果字符串中的所有字符都是大写,则返回 True。‘PLAY’.isupper()输出结果为:True
join可迭代对象,里面的元素只能是str不能是int把可迭代对象的元素连接到字符串的末尾。——’.join((‘halou’,‘world’,‘how’,‘are’,‘you’))输出结果为:halou*——world——how——are——*you
ljustwidth所返回字符串的长度,若小于等于原有字符串长度则返回原有字符串,若大于原有字符串长度向右补充指定字符。fillchar指定字符,默认是空格返回字符串的左对齐版本。‘dfdsfd’.ljust(10,’-'输出结果为:dfdsfd----
rjustwidth所返回字符串的长度,若小于等于原有字符串长度则返回原有字符串,若大于原有字符串长度向右补充指定字符。fillchar指定字符,默认是空格返回字符串的右对齐版本。‘dfdsfd’.rjust(10,’-’)输出结果为:----dfdsfd
lower把字符串转换为小写。‘哈喽,Hello World Nihaoya’.lower()输出结果为:哈喽,hello world nihaoya
upper把字符串转换为大写。‘哈喽,Hello World Nihaoya’.lower()输出结果为:哈喽,HELLO WORLD NIHAOYA
stripcharacters一组要删除的前导/结尾字符返回字符串的剪裁版本。删除所有前导和结尾字符(空格是要删除的默认前导字符)。‘------dss—fdsfsds—’.lstrip(’-’)输出结果为:dss—fdsfsds
lstripcharacters一组作为前导字符要删除的字符。返回字符串的左修剪版本。该方法删除所有前导字符(空格是要删除的默认前导字符)。‘------dss—fdsfsds—’.lstrip(’-’)输出结果为:dss—fdsfsds—
rstripcharacters一组作为结尾字符要删除的字符。返回字符串的右边修剪版本。该方法删除所有结尾字符(空格是要删除的默认结尾字符)。‘------dss—fdsfsds—’.lstrip(’-’)输出结果为:------dss—fdsfsds
partitionvalue指定字符串搜索指定的字符串,并将该字符串拆分为包含三个元素的元组。第一个元素包含指定字符串之前的部分。第二个元素包含指定的字符串。第三个元素包含字符串后面的部分。只搜索指定字符串的第一个匹配项。‘zheyangzima oumaiga den’.partition(’ ')输出结果为:(‘zheyangzima’, ’ ', ‘oumaiga den’)
rpartitionvalue指定字符串搜索指定的字符串,并将该字符串拆分为包含三个元素的元组。第一个元素包含指定字符串之前的部分。第二个元素包含指定的字符串。第三个元素包含字符串后面的部分。只搜索指定字符串的最后一个匹配项。‘zheyangzima oumaiga den’.partition(’ ')输出结果为:(‘zheyangzima oumaiga’, ’ ', ‘den’)
replaceoldvalue、newvalue、count可选。数字,指定要替换的旧值出现次数。默认为所有的出现。返回字符串,其中指定的值被替换为指定的值。‘zhangsan nihao a’.replace(‘an’,‘lisi’,1)输出结果为:zhlisigsan nihao a
rfindvalue、start、end在字符串中搜索指定的值,并返回它被找到的最后位置。如果找不到则返回-1‘zhangsan nihao a’.rfind(‘an’)输出结果为:6
rindexvalue、start、end在字符串中搜索指定的值,并返回它被找到的最后位置。如果找不到则抛异常‘zhangsan nihao a’.rindex(‘an’)输出结果为:6
rsplitseparator 拆分字符串的分隔符,默认为空格,max 指定拆分数,默认为-1,也即所有地方。默认不指定max与split用途相同,指定max后从后面开始拆分。指定max后会得到max+1个元素用指定的分隔符处拆分字符串,并返回列表。‘hello world’.rsplit(‘o’,1)输出结果为:[‘hello w’, ‘rld’]
splitseparator 拆分字符串的分隔符,默认为空格,指定max后从前面开始拆分在指定的分隔符处拆分字符串,并返回列表。‘hello world’.split(‘o’,1)输出结果为:[‘hell’, ’ world’]
splitlineskeeplinebreaks 是否包含换行符,True为包含 False为不包含,默认为不能包含,也即换行符当作一行去拆分按行拆分字符串并返回列表。print(str3.splitlines(keepends=False));# ['', ' hello', ' how', ' are you', ' i fine', ' thank you', ' and', ' you?', ' ']``````print(str3.splitlines(keepends=True))# ['\n', ' hello\n', ' how\n', ' are you\n', ' i fine\n', ' thank you\n', ' and\n', ' you?\n', ' ']
swapcase切换大小写,小写成为大写,反之亦然。‘哈喽,Hello World Nihaoya’.swapcase()输出结果为:哈喽,hELLO wORLD nIHAOYA
title把每个单词的首字符转换为大写。‘hello world’.title()输出结果为:Hello World
zfilllen 指定字符串长度在字符串的开头填充0 ,直到达到指定的字符串长度,如果原有字符串长度小于指定长度则直接返回原字符串‘hello’.zfill(20)输出结果为:000000000000000hello

casefold和lower的区别

首先来看一下两个的源码中是怎么说的?
lower-> Return a copy of the string converted to lowercase.
casefold-> Return a version of the string suitable for caseless comparisons.
从上面可以看出,lower只是去看大小写,不论是英文字母或者德语、俄罗斯语、法语等,它都会去看一下是否有大写字母,如果有则转成小写后返回结果。
但是casefold在考虑大小写的过程中还考虑到一层是能否做字符串的比较运算,考虑到字符串的语言环境,会对其进行转换。比如德语中的ß会转换为ss

isdecimal具体用途以及isnumeric和isdigit的区别暂时还没搞很清楚,后边补上

Number

int

常用方法:

方法名参数方法用途例子
as_integer_ratio返回一对整数,其比值正好等于原始整数,分母为正。(10).as_integer_ratio() 输出结果为:(10, 1)。如果是bool类型,True结果为:(1,1).False结果为:(0, 1)
bit_length用二进制表示自身所需的位数。(10).bit_length()输出结果为:4,该值的二进制为1010,共有4位
float

常用方法:

方法名参数方法用途例子
as_integer_ratio返回一对整数,其比率恰好等于原始浮点数,分母是正的。在无穷大上引发OverflowError,在nan上引发ValueError。(10.0).as_integer_ratio() 输出结果为:(10, 1)
is_integer判断是否为整数,整数返回True,浮点数返回False(3.0).is_integer()输出结果为:True
complex

复数由实部和虚部组成,实部和虚部都应该是浮点型。虚部末尾以j或J结束
例如:15.3+6.29j

bool

布尔类型只有两个值:True和False
bool类型可以使用int类型的方法,因为布尔类型的True相当于是int类型的1,False相当于是int类型的0

Tuple元组

形式:(值1,值2,……,值n)
tuple虽然为不可变类型,但是其内部可以包含可变对象,例如list
()表示空元组
如果要创建只有一个元素的元组:(1,)切记需要加个逗号

切片对于字符串、元组、列表都适用,选取的区间为左闭右开
变量[起始下标,结束下标,步长]
[:]从头取到尾
[::-1]倒着取

常用方法:

方法名参数方法用途例子
countvalue元组中的某个元素查看元组中某个元素在元组中出现的个数(1,2,3,4,5).count(5)输出结果为:1
indexvalue、start、end查看指定元素的下标,如果指定start和end则从该范围内查找,如果元组中不存在则抛异常(1,2,3,4,5).index(5)输出结果为:4
tupleseq列表将列表或者其他可迭代对象转换为元组tuple(‘hello’)输出结果为:(‘h’, ‘e’, ‘l’, ‘l’, ‘o’)

练习题:

    '''
    1 创建score 元组,其中包含10 个数值 (675,345,56,377,76,885,564,34,723,51);
    2 输出score 元组中第2个元素的数值;
    3  输出score 元组中第1~3 个元素的值;
    '''
    score = (675,345,56,377,76,885,564,34,723,51)
    print(score[1])
    print(score[0:3])

List列表

形式:[值1,值2,……,值n]
list为有序集合,为可变类型,可随时添加、删除、更新指定元素。可以被截取,可以使用+或者相关方法来进行拼接,可以使用*一个数字进行复制

常用方法:

方法名参数方法用途例子
appendobj在元素末尾添加新的对象lis1.append([2,5,6])。打印lis2的输出结果为:[1, 2, 4, 5, 7, 9, [2, 5, 6]],这里的参数为object类型,所以可以追加任何类型的对象
clear从列表中移除所有元素lis1.clear()输出结果:空列表[]
copy浅拷贝,返回值为拷贝的列表lis1.copy()
countvalue元素统计某个元素在列表中出现的次数,如果列表中没有则为0[3,5,7,8,3].count(1)
extend可迭代对象在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表),如果参数为一个列表,会将参数列表中的参数拆开存进去,不会当作一个新对象来存储lis2.extend([2,5,8,4])打印lis2的输出结果: [3, 5, 7, 8, 3, 2, 5, 8, 4]
indexvalue,start,end从列表中找出某个值第一个匹配项的索引位置,如果指定start和end则从该范围内查找,如果元组中不存在则抛异常[2,5,8,0,2].index(2)。输出结果为:0
insertindex,object将对象插入列表lis2.insert(0,[2,5,9]) 打印lis2的输出结果:[[2, 5, 9], 3, 5, 7, 8, 3, 2, 5, 8, 4]
popindex移除列表中的一个元素(默认最后一个元素),并返回该元素的值lis2.pop(3).输出结果:7
removevalue移除列表中某个值的第一个匹配项lis2.remove(8) 打印lis2的输出结果:[[2, 5, 9], 3, 5, 3, 2, 5, 8, 4]
reverse反向列表中的元素lis2.reverse()。打印lis2的输出结果为:[4, 8, 5, 2, 3, 5, 3]
sortkey 为排序方法,可写lambda表达式,函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。reverse 排序规则,reverse = True 降序, reverse = False 升序(默认)。对原列表进行排序对于字符串列表,默认是按照首字母进行排序,如果首字母相等则比较第二个字母,以此类推s1 = [‘hi’,‘hello’,‘omg’,‘soga’]s1.sort(key=lambda x:x[1])输出结果为:[‘hello’, ‘hi’, ‘omg’, ‘soga’]

由上面的copy方法涉及到了深拷贝和浅拷贝。这里具体讲一下深拷贝、浅拷贝的区别,以及python对于可变类型的深拷贝、浅拷贝的几种方法
浅拷贝指不拷贝子对象的内容,只拷贝子对象的引用。而深拷贝会连子对象的内存也全部拷贝一份,对于子对象的修改不会影响到源对象

  1. 直接赋值,即a=list b=a的问题,变量b直接指向a的地址。是为浅拷贝,内存地址完全相同,改变任意一个变量里的任意一个值,另一个变量都会有对应的变化
    直接赋值
  2. copy方法 【列表的copy方法与copy包的copy方法效果等同】
    第一次对b进行append时,只是在b原有的基础上增加了一个对象,对a并不会造成任何影响
    对a[2]里追加对象时,由于b和a都来自同一个引用地址,所以两个都是跟着变化的
    最后a[0]=10,由于不可变string类型重新赋值时并不会改变其值,而是重新在内存中开辟一个新的空间赋新值,再将引用指向新值,所以a[0]的引用地址指向70的空间,而b[0]还是指向原有10所在空间
    最终的输出结果为:a: [70, 20, [5, 6, 30]] b: [10, 20, [5, 6, 30], 52]
    copy方法
  3. 深拷贝copy.deepcopy()
    深克隆

Dict字典

形式:{key1:value1,key2:value2}
字典为key-value的键值对类型
key必须使用不可变类型,并且key为唯一的,不可重复
{}创建空字典
常用方法:

方法名参数方法用途例子
clear删除字典内所有的元素dic.clear() 打印dic输出结果为:{}
copy返回一个字典的浅拷贝dic2 = dic.copy() 打印dic2输出结果为:{‘name’: ‘张三’, ‘age’: 20}
fromkeysseq也即keys 新字典的键所在的可迭代对象 val 所有键的值,默认是None创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应 的初始值dict.fromkeys((1,5,9,3,6),20)输出结果为:{1: 20, 5: 20, 9: 20, 3: 20, 6: 20}
getkey,default_value返回指定键的值,如果值不在字典中返回default值dic2.get(‘name’,’’)输出结果:张三
items以列表返回可遍历的(键, 值) 元组数组dic2.items()输出结果为:dict_items([(‘name’, ‘张三’), (‘age’, 20)])
keys以列表返回一个字典所有的键dic2.keys输出结果为:dict_keys([‘name’, ‘age’])
popkey需要删除键值对的key,defaultvalue,假如指定的key不存在,如果指定了该值就会返回该值,否则会抛异常删除字典给定键 key 所对应的值,返回值为被删除的值。如果key不存在返回defaultvalue的值dic2.pop(‘nm’,‘不用删了,key不存在’)输出结果为:不用删了,key不存在
popitem返回并删除字典中的最后一对键和值。dic2.popitem()输出结果:{‘age’: 20, ‘addr’: ‘bj’, ‘grade’: 100.0}
setdefaultkey,default和get()类似, 但如果键不存在于字典中,将会添加键并将值设 为default。如果key存在则对值进行覆盖dic2.setdefault(‘alisa’,‘zhangsan’) dic2.setdefault(‘name’,‘张潇洒’)打印dic2的输出结果为:{‘age’: 20, ‘addr’: ‘bj’, ‘grade’: 100.0, ‘alisa’: ‘zhangsan’, ‘name’: ‘张潇洒’}
update具有键值对的字典或者是可迭代对象把字典或者可迭代对象【值默认为none】的键/值对插入到dict里dic2.update(lever=4,classize=2)或者dic3.update({‘tom’: {‘phone’: ‘12545’, ‘addr’: ‘bj’}})
values以列表返回字典中的所有值dic2.values()输出结果为:dict_values([20, ‘bj’, 100.0, ‘zhangsan’, ‘张潇洒’])

Set集合

形式:{元素1,元素2,……,元素n}
set集合为无序不可重复的元素序列

注意创建空的set集合需要使用set函数,不能直接等于{},因为其为用来创建一个空的字典
如果创建集合里里面有重复数据,则会自动去重

常用方法:

方法名参数方法用途例子
add待添加元素向集合中添加元素,如果该值在集合中已经存在也不添加。待添加元素只能为不可变类型set1.add(‘hello’)、set1.add(True)、set1.add((2,3))
clear移除集合中的所有元素set1.clean()
copy浅拷贝一个集合set1.copy()
difference一个或者多个可迭代对象,将主对象与参数求差值将两个或多个集合的差值作为一个新集合返回。set2.difference([(1,2),(2,3)],{2,3,4,5,6,8})输出结果为:{1, 7, 9, ‘hello’}
difference_update一个或者多个可迭代对象移除在另一个或多个集合中的元素set2.difference_update([(1,2),(2,3)],{2,3,4,5,6,8})与difference方法的区别是该方法是在set2中进行删除,difference方法是将差值对象返回
discard待删除元素删除集合中指定的元素,若存在则删除,不存在也不抛异常set2.discard(‘hello’)
intersection一个或多个可迭代对象返回集合的交集,是作为一个新对象来返回的set2.intersection({2,3,4,5,6,8,9})输出结果为:{9}
intersection_update一个或多个可迭代对象取集合的交集,将交集保留在原对象中,其他值移除set2.intersection_update({1,2,3,4,5,6,8,9})
isdisjoint一个可迭代对象如果两个集合有零交集则返回True。set2.isdisjoint((1,9)输出结果为:False
issubset一个可迭代对象判断该集合是否为参数集合的子集print({1,9}.issubset([1,9]));print({1,9}.issubset((1, 9)));print({1,9}.issubset({1, 9}));print({9}.issubset({9:[1, 9]}))输出结果都为:True
issuperset一个可迭代对象判断参数集合是否为该集合的子集print({1,8, 9}.issuperset([1, 9]));print({1,8, 9}.issuperset((1, 9)));print({1, 8,9}.issuperset({1, 9}));print({1,8,9}.issuperset({9: [1, 9]}))以上输出结果都为true
pop随机移除元素set2.pop()
remove待移除元素移除指定元素set2.remove(9)如果待移除元素不存在则报错
symmetric_difference一个可迭代对象返回两个集合中不重复的元素集合并赋值给新集合即为a并b-a交bset1.symmetric_difference([1,3,9])
symmetric_difference_update两个集合中不重复的元素集合,将不满足的元素从该集合中移除set1.symmetric_difference_update([1,3,9])
union一个或多个可迭代对象返回两个集合的并集,将结果赋值给新的对象set1.union([1,3,8,5,3],{2,4,6,8,10},((1,2,6,8),1,4))
update一个或多个可迭代对象给集合添加多个元素set3.update([-1,-2,-3],{1,-9},‘hello’)输出结果为:{1, 2, 3, 4, 5, 6, 7, 8, ‘h’, 10, ‘l’, ‘o’, ‘e’, (1, 2, 6, 8), ‘hello’, (2, 3), -1, -9, -3, -2}

学以致用部分(o^^o)

'''
    集合练习题:
        经理有:曹操、刘备、孙权
        技术员:曹操、孙权、张飞、关羽
        用集合求:
            1. 既是经理也是技术员的有谁?
            2  是技术员但不是经理的人有谁?
            3  是经理,但不是技术员的有谁?
            4  张飞是经理吗?
            5  身兼一职的人有谁?
            6  经理和技术员共有几人?
    '''
        '''
    集合练习题:
        经理有:曹操、刘备、孙权
        技术员:曹操、孙权、张飞、关羽
        用集合求:
            1. 既是经理也是技术员的有谁?
            2  是技术员但不是经理的人有谁?
            3  是经理,但不是技术员的有谁?
            4  张飞是经理吗?
            5  身兼一职的人有谁?
            6  经理和技术员共有几人?
    '''
    manager = {'曹操','刘备','孙权'}
    technology = {'曹操','孙权','张飞','关羽'}
    print('既是经理也是技术员的有:',manager.intersection(technology))  # 既是经理也是技术员的有: {'孙权', '曹操'}
    print('是技术员但不是经理的人有:',technology-manager.intersection(technology))  # 是技术员但不是经理的人有: {'关羽', '张飞'}
    print('是经理,但不是技术员的有:',manager-manager.intersection(technology))  # 是经理,但不是技术员的有: {'刘备'}
    print('张飞是经理吗?不是为true,是为false。答案为:',manager.isdisjoint({'张飞'}))  # 张飞是经理吗?不是为true,是为false。答案为: True
    print('身兼一职的人有:',manager.symmetric_difference(technology))  # 身兼一职的人有: {'张飞', '关羽', '刘备'}
    num_set = manager.union(technology)
    num = len(num_set)
    print(f'经理和技术员共有{num}人')  # 经理和技术员共有5人

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值