python中的数据类型与基本语法操作
Python3 中有六个标准的数据类型:
- Number(数字)
- String(字符串)
- List(列表)
- Tuple(元组)
- Set(集合)
- Dictionary(字典)
【0】数据类型脑图
【1】字符串
字符串不可以修改,直接修改操作其实是新赋值了一个字符串给它
【1.0】字符串函数
# Auth chaoqun.guo name = "my name is alex" print(name.capitalize()) # 首字母大写 print(name.count('a')) # 统计出现的次数 print(name.center(50, '-')) # 占50个字符宽度,且把 name 字符串对于这50个字符串的宽度居中,如果name字符串不足50,则用 '-' 填充 print(name.endswith("ex")) # 判断字符串结尾的字符是不是 ex print(name.expandtabs(tabsize=30)) # 把 \t 制表符换成30个字符大小 print(name.find("name")) # 从左往右,获取字符串首字母的第一次出现的位置下标,方便切片 print(name.find("name")) # 从左往右,获取字符串中最后一次出现 name 的首字母位置 print(name.format(name='alex',year=23)) #format函数,这里不特意讲了 print('ab23'.isalnum()) # 是否是一个 阿拉伯数字、字母, print('abA'.isalpha()) # 是否是一个 纯字母字符串 print('1.22222'.isdecimal()) # 是否是一个 十进制 print('12'.isdigit()) # 是否是一个 证书 print('1a'.isidentifier()) # 是否是一个 合法的变量名(中文做变量名也是可以的哦) print('aa'.islower()) # 是否是一个 小写字符串 print('aa'.isupper()) # 是否是一个 大写字符串 print('aa'.isspace()) # 是否是一个 空格 print('Aa Bb'.istitle()) # 是否是一个 标题,即每个单词首字母大写 print('hello world'.title()) # 把它变成一个 标题(即每个单词首字母大写),结果:Hello World print('-'.join(['a', 'b', 'c'])) # 把列表、或者多个字符串合并成一个字符串,以 '-' 为合并分隔符每一个元素或字符 a-b-c print('-'.join('aaaaaa')) # 把列表、或者多个字符串合并成一个字符串,以 '-' 为合并分隔符每一个元素或字符 a-a-a-a-a-a print('name'.ljust(5, '*')) # 保证字符串长度为5,如果不够则左边补全 *,同理 rjust 是一样的效果 print(' aaa bbb '.strip()) # 去掉字符串左右两边的空格和换行,相当于 trim print(' aaa bbb '.lstrip()) # 去掉字符串左边的空格和换行,相当于 ltrim ,同理 rstrip() 也是一样的效果 p = str.maketrans('abed', '1234') # 构造字符映射规则,用后面的去替换映射前面的字符,要一一对应 print('aqwcc'.translate(p)) # 应用字符映射规则,结果:1qw33 print('aabc'.replace('a', 'A')) # 替换a 为 A,如果只想替换 1个则可以 print('aabc'.replace('a', 'A',1)) print('1+2+3+4'.split('+')) # 根据某个字符或字符串分割字符串,结果以列表存储:['1', '2', '3', '4'] print('1+2\n+3+4'.splitlines()) # 根据换行符 分割字符串,结果是列表:['1+2', '+3+4'] print('aAaA'.swapcase()) # 把字符串中字符大小写互换,结构:AaAa print(' ni hao '.zfill(50)) # 0填充
【1.1】字符串:最佳实践
字符串或串(String)是由数字、字母、下划线组成的一串字符。
切片截取规则:
实例:
【1.2】Bytes
python3,文本总是Unicode,由str组成;二进制则由 bytes类型表示;
python3 中不会以任何隐式的方式混用 str 和 bytes。
不能拼接字符串和字符包,也无法再字节包里搜索字符串(反之亦然)
【1.3】Str 与 Bytes 互相转换
什么情况下,Str 需要转换成 Bytes呢?在python3中 做socket 编程的时候;
bytes 转 Str=》decode
Str 转 bytes=》encode
实践:
msg="我爱中国" print(msg.encode('utf8')) # 不写默认是utf-8 编码 print(msg.encode('utf8').decode(encoding='utf-8')) # 不写默认是utf-8 编码
【2】列表 :使用 []
有序,可增删改查
【2.1】列表:基本使用命令
# Auth chaoqun.guo name = ["张三","李四","王五"] # 切片 print(name) print(name[0]) # 获取第1个元素 print(name[0:3]) # 获取1-3下标的元素 print(name[-1]) # 获取最后一个下标的元素 print(name[::-1]) # 获取 所有倒序输出的元素 print(name[::2]) # 获取 从0开始命中之后,再步长为2的下标元素,结果是 name[0],name[2] # 列表的 增删改查 name.append("赵6") # 增:在列表最末尾追加元素 name.insert(1,"郭7") # 增:在指定下标位置添加元素,后续的会依次后推一个位置,一次只能插入一个 print(name * 4) # 增: 所有元素乘以4倍,如[1,2] 变成[1,2,1,2,1,2,1,2]
# 浅copy,主要作用是建立联合账户,比如夫妻共用一张银行卡 name1 = name.copy() # 增: 复制一个新列表出来,且第一层原列表修改不影响新列表,第二层(比如嵌套列表,它存的只是一个指针)原列表被修改那么也会被修改;用copy.deepcopy(name) 解决 n1 = name[:] #浅copy 其他办法 n2 = list(name) #浅copy 其他写法
n3 = copy.copy(name) #浅copy 其他写法
name2 = copy.deepcopy(name) # 增:完全复制一个独立的新列表出来,需要import copy name3 = name # 增: 新建一个变量指针指向相同列表地址,原列表name修改,name3也会被修改 name[2]="我是周2啊" # 改:直接修改指定下标的值 name.reverse() # 改:元素下标倒序列表 name.sort() # 改:ASCII规则排序 name.sort(reverse=True) # 改:倒序 ASCII规则排序 name.remove("我是周2啊") # 删:删除 del name[1] # 删:删除 name.pop() # 删:默认删除最后一个,如果写下标1,那就和 del name[1] 一样了 print(name.index("张三")) # 查:查看元素的下标,如果有多个就只显示最前面第1个找到 print(name.count("张三")) # 查:查看元素在列表中的个数 print("张三" in name) # 查:查看元素是否在 列表中
【2.2】列表:实践演示
【3】数字
Python支持四种不同的数字类型:
- int(有符号整型)
- long(长整型[也可以代表八进制和十六进制])
- float(浮点型)
- complex(复数)
实例
实践:
【4】元组:使用 ()
可以理解成不能修改的列表
【5.1】set集合:用 {}
# Auth chaoqun.guo list_1 = [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1] list_1 = set(list_1) # 把列表转换成集合,以此来去重 list_2 = set([1, 3, 5]) # 并交差集,子集,对称差集 print(list_1.intersection(list_2)) # 交集 print(list_1.union(list_2)) # 并集 print(list_1.difference(list_2)) # 差集,即在 list1中去掉所有与 list2 有交集的元素 print(list_1.issubset(list_2)) # 判断 list1 是否是 list2的子集,结果:False print(list_1.issuperset(list_2)) # 判断 list1 是否是 list2的父集,结果:True print(list_1.symmetric_difference(list_2)) # 对称差集,即取双方并集,但又减去双方交集 print(list_1.isdisjoint(list_2)) # 判断list1 与list2 是否没有交集,如果没有交集返回 True,有交集返回 False # 符号表示 print(list_1 & list_2) # intersection print(list_1 | list_2) # union print(list_1 - list_2) # difference print(list_1 ^ list_2) # symmetric_difference print(list_1 <= list_2) # issubset print(list_1 >= list_2) # issuperset # 增删改查 list_1.add(999) # 增加:增加元素 list_1.update([10,20,30]) # 增加:在list_1中添加多个元素 list_3 = list_1.copy() # 增加:浅复制 list_1.remove(999) # 删除:删除集合中的指定元素,如果指定元素不存在则会报错 list_1.pop() # 删除:删除任意一个集合元素,如果输出该表达式,会输出被删除的值 list_1.discard('a') # 删除:删除集合中的指定元素,如果不存在则为None print(len(list_1)) # 查询:查看集合元素个数 print(10 in list_1) # 查询:某个元素值 是否存在于集合 print(10 not in list_1) # 查询:某个元素值 是否不存在于集合
【5.2】字典:用{key:value}
【5.2.1】基本操作
特性:无序,key 唯一
# Auth chaoqun.guo info = { 'stu1': "zhang san", 'stu2': "li si ", 'stu3': "wang wu" } # 增删改查 info["stu1"] = "张三" # 增改:存在即修改,不存在则添加 del info["stu2"] # 删除:key info.pop("stu2") # 删除:Key info.popitem() # 删除:任意删一个KV print(info) # 查询:获取所有的KV print(info["stu2"]) # 查询:获取K 对应的V,如果不存在则报错 info.get("stu2") # 查询:获取K 对应的V,如果不存在则输出 None print("stu2" in info) # 查询:判断K 是否在该字典中,如果存在则 True 否则 False info.values() # 查询:打印所有的 Value info.keys() # 查询:打印所有的 Key info.setdefault("stu4", "zhao liu") # 查询/新增:如果key 存在则查询,否则新建该key 然后查询该Key对应value info = {'stu1': "zhang san", 'stu2': "li si ", 'stu3': "wang wu"} info1 = {"stu1": "gg", "stu4": "gg", "stu5": "gg"} info.update(info1) # 修改:把info中的信息 修改成info1的,有交集的直接替换,没交集的则插入 info.items() # 修改:把一个字典转换成列表,每一个KV键值对就是一个列表元素 print( dict.fromkeys([4, 5, 6], "test") ) # 初始化,初始化一个字典,默认值为"test" ,输出:{4: 'test', 5: 'test', 6: 'test'} q = dict.fromkeys([4, 5, 6], ["aa", "bb", {"name": "gg"}]) # 多层初始化不要用,修改一个所有元素都会被修改 print(q) q[6][2]["name"]= "aa" print(q) # 输出结果: {4: ['aa', 'bb', {'name': 'aa'}], 5: ['aa', 'bb', {'name': 'aa'}], 6: ['aa', 'bb', {'name': 'aa'}]}
# 嵌套 可以嵌套任意数据类型 info = { "一中": {"1班人数": 30, "2班人数": 20, "3班人数": 10}, "四中": {"1班人数": 15, "4班人数": 25, "7班人数": 33}, "六中": {"2班人数": 26, "5班人数": 32, "7班人数": 12}, } # 循环遍历字典 for i in info: # 该办法效率高很多 print(i, info[i]) for k, v in info.items(): print(k, v)
【5.2.2】三级菜单案例
# 三级菜单 data = { '湖南省': { '长沙市': { '岳麓区': '我们这里有岳麓山啊', '芙蓉区': '我们这里有芙蓉广场啊' }, '永州市': { '东安区': '我们这里有好吃的东安鸡啊', '祁阳县': '我们这里有好吃的炒血鸭啊' } }, '广东省': { '深圳市': { '南山区': '我们这里有腾讯啊', '龙岗区': '我们这里有华为啊' }, '广州市': { '天河区': '我说我这里有广州塔,你信吗?', '白云区': '我们这里有4399游戏公司,你信吗?' } } } exit_flag = False while not exit_flag: for i in data: print('1', i) choice = input("选择进入省>>(b返回,q退出):") if choice in data: while not exit_flag: for i2 in data[choice]: print("\t2.",i2) choice2 = input("选择进入市>>(b返回,q退出):") if choice2 in data[choice]: while not exit_flag: for i3 in data[choice][choice2]: print("\t\t3.", i3) choice3 = input("选择进入区(b返回,q退出)>>:") if choice3 in data[choice][choice2]: print(data[choice][choice2][choice3]) elif choice3 == 'b': break elif choice3 == 'q': exit_flag = True else: print("您输入的名称不存在,请查看列表重新输入~~") elif choice2 == 'b': break elif choice2 == 'q': exit_flag = True else: print("您输入的名称不存在,请查看列表重新输入~~") elif choice == 'b': break elif choice == 'q': exit_flag = True else: print("您输入的名称不存在,请查看列表重新输入~~")
结果:
【5.2.3】基本概念
【6】python中的常用操作
【6.1】python中的多行语句
使用\,()、[]、{} 也可以达到这个效果
【6.2】python中的注释
### python中的注释
单行注释 #
多行注释
(1)''' 内容 '''
(2) """ 内容 """
# 第一个注释 print ("Hello, Python!") # 第二个注释 ''' 这是多行注释,使用单引号。 这是多行注释,使用单引号。 这是多行注释,使用单引号。 ''' """ 这是多行注释,使用双引号。 这是多行注释,使用双引号。 这是多行注释,使用双引号。 """
【6.3】print输出,不换行输出
【6.4】设置字符编码
### 字符编码
1. # coding: UTF-8
【6.5】导入库 import
import 与 from...import
在 python 用 import 或者 from...import 来导入相应的模块。
将整个模块(somemodule)导入,格式为: import somemodule
从某个模块中导入某个函数,格式为: from somemodule import somefunction
从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
将某个模块中的全部函数导入,格式为: from somemodule import *
关于 import 的小结,以 time 模块为例:
1、将整个模块导入,例如:import time,在引用时格式为:time.sleep(1)。
2、将整个模块中全部函数导入,例如:from time import *,在引用时格式为:sleep(1)。
3、将模块中特定函数导入,例如:from time import sleep,在引用时格式为:sleep(1)。
4、将模块换个别名,例如:import time as abc,在引用时格式为:abc.sleep(1)。
【6.6】类型转换
当字符串内容为浮点型要转换为整型时,无法直接用 int() 转换:
a='2.1' # 这是一个字符串
print(int(a))
会报错 "invalid literal for int() "。
需要把字符串先转化成 float 型再转换成 int 型:
a='2.1'
print(int(float(a)))
【6.7】format
(1)不写参数,用位置对应
a='gg' b=25 print('my name is {},I am {} years old'.format(a,b))
my_list = ['菜鸟教程', 'www.runoob.com'] print("网站名:{0[0]}, 地址 {0[1]}".format(my_list)) # "0" 是必须的
写参数,赋值对应
username='a' password='b' info=''' info of {name} --username:{name} --password: {pwd} '''.format(name=username,pwd=password)
print(info)
【6.8】格式化赋值
username='a' password='b' info=''' --username:%s --password: %s ''' %(username,password)
【6.9】三元运算赋值(result = a if a>b else c)
a,b,c = 1,3,5 result = a if a>b else c print(result)
结果: 5
【6.10】设置文件编码格式
三种方式:
1.# -*- coding: <encoding name> -*- : # -*- coding: utf-8 -*- 2.# coding=<encoding name> : # coding=utf-8 3.# coding:<encoding name> : # coding: utf-8
【6.11】生成器( b = [i*2 for i in range(10)] )
【6.12】字符串不转义,在字符串前面加 r
print(r'abc \n eee\taaa') abc \n eee\taaa
【6.13】输入值,多个值输入
a,b,c = input("请输入三角形三边的长:").split() # 默认空格做多个值分隔
#同时如果想要使用逗号(,)隔开,则可以使用input().split(’,’)
【总结】
(1)字符串、数字不可以修改
如下,我们可以看到,虽然赋值成功了,但是已经不是同一个ID值了,变量其实是一个指针,指向了这个内存中生成的固定字符串而已
然后,我们的不可更改就如下面
(2)列表可以增删改查
如下图,演示了增删操作;还有appen 可以在末尾追加