python-数据类型(上):数字、布尔值、字符串、字典
变量是用来保存临时数据的
在python中,只要定义了一个变量,而且它有数据,那么它的类型就已经确定了,系统会自动辨别。可以使用type(变量的名字),来查看变量的类型。
查看数据类型:type(2**32)
内置函数help
如果查看一个类的所有方法
首先要确定他的类型 -> type(数值) <class "类型">
help(类型)
如果查看这个类型的指定的方法
help(类型.方法名)
数字:
int(有符号整形):
在32位机器上,整数的位数是32位,取值范围为-2**31~2**31-1;
在64位机器上,整数的位数是64位,取值范围为-2**63~2**63-1
long(长整形,也可以代表八进制和十六进制):
python的长整数没有指定位宽
python3里只有整型的概念,没有长整型。如果整数发生溢出,python会自动将整数数据转换为长整数
float(浮点型):
3.23,52.3E-4
complex(复数):-5+4j,j是虚数
布尔值:
True或False:真或假,1或0
字符串:
字符串其实就是一个有序的字符序列(顺序是不可以改变的)
# python中定义一个字符串 无论是单引号 还是双引号 是等价的 name = "hello" name1 = 'hello' if name == name1: print("name 和 name1是等价的")
定义一个空的字符串 '' 或者 "" 或者 str()
空字符串 代表的就是 字符串中没有一个字符
name = str() print(type(name)) #<class 'str'> l = len(name) print("name的字符个数:%d" % l) #值为0
print("哈喽\n你好\n世界") # \n:换行 # 保留其文本格式 可以使用三引号(" 或者 ') my_str ='''哈喽你好你好你好你好你好你好 你好世界世界世界世界 世界世界世界世界世界 哈喽你好你好你好你好你好你好 你好世界世界世界世界 世界世界世界世界世界''' print(len(my_str)) #\n也是一个字符长度
my_str = "hello" # 得到e这个字符 并打印(程序中 是从0开始) -> 下标索引 # 传入一个正常的下标索引 # 如果从左到右开始索引是0, 1, 2, 3.... ret = my_str[1] print(ret) # 从右到左开始的索引是-1, -2, -3, .... ret = my_str[-4] print(ret) # 一定要保证字符串的下标索引是存在的 # 利用while 打印出字符串中的每个字符 # 定义一个变量 index = 0 l = len(my_str) # 定义一个变量记录字符串的长度 while index < l: ret = my_str[index] print(ret) index += 1
# 切片的语法:[起始:结束(开区间):步长] # 字符串是不可变的(改的都是复制版的) a = "abcdef" # 'abc' -> a[0:3] 或者 a[:3] # 如果是从头部开始 0可以省略 ret1 = a[:3] print(ret1) # 验证字符串是不可变的 print(a) # 'ace' a[:5:2] 或者 a[0:5:2] 或者 a[::2] #默认步长是1 ret2 = a[::2] print(ret2) ret3 = a[1:4:2] # 'bd' ret4 = a[::-2] # 'fdb' ret5 = a[-1:-4:-2] # 'fd'
mystr = "my \tname is {name} and i am {age} old" #\t代表tab键 # <1>find # mystr.find(str, start=0, end=len(mystr)) 检测 str 是否包含在 mystr中,如果是返回开始的索引值,否则返回-1 # 获取对应字符串的下标索引 print(mystr.find("name")) # 字符串中name的索引,结果:4 # <2>index # mystr.index(str, start=0, end=len(mystr)) 跟find()方法一样,只不过如果str不在 mystr中会报一个异常. print(mystr.index("name")) # 字符串中name的索引,结果:4 # <3>count # mystr.count(str, start=0, end=len(mystr)) 返回 str在start和end之间 在 mystr里面出现的次数 print(mystr.count("a")) # a的数量,结果:5 # <4>replace # mystr.replace(str1, str2, mystr.count(str1)) 把 mystr 中的 str1 替换成 str2,如果 count 指定,则替换不超过 count 次. print(mystr.replace("a", "w")) # 替换,结果:my nwme is {nwme} wnd i wm {wge} old print(mystr.replace("a", "w", 1)) # 替换1个,结果:my nwme is {name} and i am {age} old # 5>split # mystr.split(str=" ", 2) 以 str 为分隔符切片 mystr,如果 maxsplit有指定值,则仅分隔 maxsplit 个子字符串 print(mystr.split()) # 按空格分,结果:['my', 'name', 'is', '{name}', 'and', 'i', 'am', '{age}', 'old'] print(mystr.split('am')) # 按am分,结果:['my \tn', 'e is {n', 'e} and i ', ' {age} old'] print(mystr.split('am', 2)) # 按am分2个,结果:['my \tn', 'e is {n', 'e} and i am {age} old'] print('1+2+3+4'.split('+')) # 结果:['1', '2', '3', '4'] print('1+2\n+3+4'.splitlines()) # 按换行来分,结果:['1+2', '+3+4'] # <6>capitalize # mystr.capitalize() 把字符串的第一个字符大写 print(mystr.capitalize()) # 首字母大写,结果:My name is {name} and i am {age} old # <7>title # 把字符串的每个单词首字母大写 print(mystr.title()) # 结果:My Name Is {Name} And I Am {Age} Old print('My Name Is '.istitle()) # 判断每个首字母是否大写,结果:True # <8>startswith # mystr.startswith(hello) 检查字符串是否是以 hello 开头, 是则返回 True,否则返回 False print(mystr.startswith("my")) # 结果:True # <9>endswith # mystr.endswith(obj) 检查字符串是否以obj结束,如果是返回True,否则返回 False. print(mystr.endswith("old")) # 判断一段字符串以什么结尾,结果:True # <10>lower # mystr.lower() 转换 mystr 中所有大写字符为小写 print(mystr.lower()) # 变小写,结果:my name is {name} and i am {age} old # <11>upper # mystr.upper() 转换 mystr 中的小写字母为大写 print(mystr.upper()) #变大写,结果:MY NAME IS {NAME} AND I AM {AGE} OLD # <12>ljust # mystr.ljust(width) 返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串 print(mystr.ljust(50)) #长度50,不够后面用空格补上 print(mystr.ljust(50,'*')) #长度50,不够后面用*补上。结果:my name is {name} and i am {age} old************* # <13>rjust # mystr.rjust(width) 返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串 print(mystr.rjust(50,'-')) #长度50,不够前面用-补上。结果:-------------my name is {name} and i am {age} old # <14>center # mystr.center(width) 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串 print(mystr.center(50,"-")) #打印50个字符,不够的用"-"补上,mystr放中间。结果:------my name is {name} and i am {age} old------- # <15>lstrip # mystr.lstrip() 删除 mystr 左边的空白字符(无论是空格 还是\n 或者是\t) print('\nAlex\n'.lstrip()) print('2222abcd33333'.lstrip("2")) # 结果:abcd33333 # <16>rstrip # mystr.rstrip() 删除 mystr 字符串末尾的空白字符 print('\nAlex\n'.rstrip()) # 去掉右边的空格和回车 print(' 2222abcd33333'.rstrip("3")) # 结果: 2222abcd # <17>strip # 删除mystr字符串两端的空白字符 print(' Alex\n'.strip()) # 去掉左边和右边的空格和回车,结果:Alex # <18>rfind # mystr.rfind(str, start=0,end=len(mystr) ) 类似于 find()函数,不过是从右边开始查找. print("abcbdf".find("b")) # 从左侧到右侧查找,结果:1 print("abcbdf".rfind("b")) # 找到最后面那个值的下标,结果:3 print("abcbdf".rfind("e")) # 查不到结果为-1 # <19>rindex # mystr.rindex( str, start=0,end=len(mystr)) 类似于 index(),不过是从右边开始. 查不到异常 # <20>partition 开发中使用 # mystr.partition(str) 把mystr以str分割成三部分,str前,str和str后 print("acbdf".partition("c")) # 结果:('a', 'c', 'bdf') # <21>rpartition # mystr.rpartition(str) 类似于 partition()函数,不过是从右边开始. print("acbdf".rpartition("c")) # 结果:('a', 'c', 'bdf') # <22>splitlines # mystr.splitlines() 按照行分隔,返回一个包含各行作为元素的列表 print('abc\nde\nf'.splitlines()) # 结果:['abc', 'de', 'f'] # <23>isalpha # mystr.isalpha() 如果 mystr 所有字符都是字母 则返回 True,否则返回 False print(mystr.isalpha()) # 结果:False # <24>isdigit # mystr.isdigit() 如果 mystr 只包含数字则返回 True 否则返回 False. print('12'.isdigit()) #是否是整数,结果:True # <25>isalnum # mystr.isalnum() 如果 mystr 所有字符都是字母或数字则返回 True,否则返回 False print(mystr.isalnum()) # 结果:False # <26>isspace # mystr.isspace() 如果 mystr 中只包含空格,则返回 True,否则返回 False. print(' '.isspace()) #是不是空格,结果:True # <27>join # mystr.join(str) mystr 中每个元素后面插入str,构造出一个新的字符串 my_list = ["1", "x", "hello"] # 定义一个变量 记录列表 print("00".join(my_list)) # 结果:100x00hello print('+'.join(['1','2','3'])) # 结果:1+2+3
name = "my \tname is {name} and i am {age} old" #\t代表tab键 print(name.expandtabs(tabsize=30)) #把tab键转成多少个空格 print(name[name.find("name"):]) #字符串的切片 print(name.format(name = 'alex',age = 25)) print(name.format_map({'name': 'alex','age': 25})) print('12'.isdecimal()) #是否是十进制 print('_1A'.isidentifier()) #判断是不是一个合法的标识符 print('a 1A'.islower()) #判断是不是小写 print('a 1A'.isnumeric()) #是不是只有数字 print('My Name Is '.isprintable()) #能不能打印,字符串里用不着,tty file,drive file不能打印 print('My Name Is '.isupper()) #是不是大写 p = str.maketrans("abcdef",'123456') print('alex li'.translate(p)) print('Alex Li'.swapcase()) #大小写互换 print('alex li'.zfill(50)) #长度不够的前面补0
字典操作:
字典一种key-value的数据类型
字典的特性:
dict是无序的,可变的
key必须是唯一的,so天生去重
# 格式: 字典名 = {键值1: 实值1, 键值2: 实值2, .....} # 键值1: 实值1 统称为 键值对 key value 也称之为元素 # 键值数据类型的选择: 必须是不可变的 # 键值 的名字不能重复(才能完成1对1 通过一个key 获取key 的value) # 字典的key 一般都是使用字符串 # 字典的value 没有规定 (可以重复的) my_dict = {"name": "小明", "age": 22, "no": "007"} # 三个元素(键值对) print(len(my_dict)) # 3 # 定义一个特殊 (空字典) my_dict1 = {} print(len(my_dict1)) # 0 print(type(my_dict1)) # <class 'dict'> my_dict2 = dict() print(type(my_dict2)) # <class 'dict'>
# <1>修改元素 # 字典的每个元素中的数据是可以修改的,只要通过key找到,即可修改 # 通过key 获取对应key的value的值 my_dict = {"name": "小红", "age": 22, "no": "009"} print(my_dict["age"]) # 通过key 修改对应key的value的值 my_dict["age"] = 220 print(my_dict) # <2>添加元素 # 格式: 字典名[key] = value # 如果在使用 变量名['键'] = 数据 时,这个“键”在字典中,不存在,那么就会添加一组键值对。 # 如果使用上面的格式 如果这个key存在 会把key原来的value的值进行覆盖 my_dict["title"] = "哈哈" print(my_dict) # <3>删除元素 # 对字典进行删除操作,有一下几种: # del (python内置函数) # clear() my_dict = {"name": "小红", "age": 22, "no": "009"} # 删除键值对 格式: del 字典名[key] del my_dict["no"] print(my_dict) # clear 删除字典中的所有的元素 my_dict.clear() # 等价于 my_dict = {} 或者 my_dict = dict() print(my_dict) # {}
info = { 'stu1101':"TengLian Wu", 'stu1102':"LongZe LuaLa", 'stu1103':"XiaoZe MaLiya", } print(info) print(info['stu1101']) #百分百确定有这个key再用这个方式查找 print(info.get('stu1104')) #查找,有就返回,没有None print('stu1103' in info) #判断在不在 info.pop('stu1102') #删除 info.popitem() #随机删除 print(info)
my_dict = {"name": "小红", "age": 22, "no": "009"} # <1>len() # 测量字典中,键值对的个数 l = len(my_dict) print("元素数:%d" % l) # 元素数:3 # <2>keys # 返回一个包含字典所有KEY的列表 keys = my_dict.keys() print(keys) # dict_keys(['name', 'age', 'no']) 其实就是列表类型 dict_keys # 如果想转成list类型也可以 print(list(keys)) # ['name', 'age', 'no'] # <3>values # 返回一个包含字典所有value的列表 values = my_dict.values() print(list(values)) # ['小红', 22, '009'] # <4>items -> 最外层是一个列表 每个元素是一个元组 (元素1(key), 元素2(value)) items = my_dict.items() print(items) # dict_items([('name', '小红'), ('age', 22), ('no', '009')]) print(list(items)) # [('name', '小红'), ('age', 22), ('no', '009')]
遍历
# 可以遍历的 字符串 列表 元组 字典 -> for循环 # 自定义一个列表 快速创建一个有规律的列表 my_list = list("abcd") print(my_list) # ['a', 'b', 'c', 'd'] for value in my_list: print(value) # 自定义一个元组 my_tuple = tuple("123456") print(my_tuple) # ('1', '2', '3', '4', '5', '6') for value in my_tuple: print(value) # 定义一个字典 my_dict = {"name": "小红", "age": 22, "no": "009"} # 遍历-key for key in my_dict.keys(): print(key) # 遍历value for value in my_dict.values(): print(value) # 遍历items for item in my_dict.items(): # item这个临时变量的类型是元组 print(item[0]) print(item[1]) # 通过设置两个临时变量 for key, value in my_dict.items(): print("key:", key) print("value:", value) # 如果想使用元素和下标索引 请使用enumerate(列表名) my_list = list("abcd") # 不仅要获取列表中的元素 而且需要知道这个元素下标索引 for i, value in enumerate(my_list): print(i,value)
info = { 'stu1101':"TengLian Wu", 'stu1102':"LongZe LuaLa", 'stu1103':"XiaoZe MaLiya", } for i in info: print(i,info[i]) #高效 for k,v in info.items(): #把字典转成列表的过程 print(k,v)
多级字典嵌套:
av_catalog={ "欧美":{ "www.youporn.com":["很多免费的,世界最大的","质量一般"], "www.pornhub.com": ["很多免费的,也很大", "质量比youporn高点 "], "letmedothistoyou.com": ["多是自拍,高质量图片很多", "资源不多,更新慢"], "x-art.com": ["质量很高,真的很高", "全部收费,屌比请绕过"], }, "日韩":{ "tokyo-hot": ["质量怎样不清楚,个人已经不喜欢日韩范了", "听说是收费的"], }, "大陆": { "1024": ["全部免费,真好,好人一生平安", "服务器在国外,慢"], } } av_catalog['大陆']['1024'][1]="可以在国内做镜像" print(av_catalog)
info = { 'stu1101':"TengLian Wu", 'stu1102':"LongZe LuaLa", 'stu1103':"XiaoZe MaLiya", } print(info.values()) print(info.keys()) info.setdefault('stu1104',"haha") info.setdefault('stu1101',"haha") #有这个key就返回,没有创建 print(info)
info = { 'stu1101':"TengLian Wu", 'stu1102':"LongZe LuaLa", 'stu1103':"XiaoZe MaLiya", } b = { 'stu1101':"Alex", 1:3, 2:5 } info.update(b) #有交叉就更新,没有创建 print(info) c = dict.fromkeys([6,7,8],"test") #初始化一个新的字典,三个key共享一个value,一个内存地址,即使修改,value也都一样 print(c) print(info.items()) #把字典转成了列表
三级菜单:
data = { '北京':{ "昌平":{ "沙河":["oldboy","test"], "天通苑":["链家地产","我爱我家"] }, "朝阳":{ "望京":["奔驰","陌陌"], "国贸":["CICC","HP"], "东直门":["Advent","飞信"] }, "海淀":{} }, '山东':{ "德州":{}, "青岛":{}, "济南":{}, }, '广东':{ "东莞":{}, "常熟":{}, "佛山":{} } } while True: for i in data: print(i) choice = input("一级菜单请选择进入>>:") if choice in data: while True: for i2 in data[choice]: print("\t",i2) choice2 = input("二级菜单请选择进入>>:") if choice2 in data[choice]: while True: for i3 in data[choice][choice2]: print("\t\t", i3) choice3 = input("三级菜单请选择进入>>:") if choice3 in data[choice][choice2]: # while True: for i4 in data[choice][choice2][choice3]: print("\t\t\t",i4) choice4 = input("最后一层,按b返回>>:") if choice4 == "b": # break pass if choice3 == "b": break if choice2 == "b": break
data数据如上
exit_flag = False while not exit_flag: for i in data: print(i) choice = input("请选择进入1>>:") if choice in data: while not exit_flag: for i2 in data[choice]: print("\t",i2) choice2 = input("请选择进入2>>:") if choice2 in data[choice]: while not exit_flag: for i3 in data[choice][choice2]: print("\t\t", i3) choice3 = input("请选择进入3>>:") if choice3 in data[choice][choice2]: for i4 in data[choice][choice2][choice3]: print("\t\t\t",i4) choice4 = input("最后一层,按b返回>>:") if choice4 == "b": pass elif choice4 == "q": exit_flag = True if choice3 == "b": break elif choice3 == "q": exit_flag = True if choice2 == "b": break elif choice2 == "q": exit_flag = True
获取value的值:name[key]和name.get[key]的区别
前者key必须存在,否则报错,后者key不存在,返回None