# 开发人员: hanhan丶
# 开发时间: 2020/10/21 14:37
#######################################################################################################
# 将数据输出到文件中
# fp = open('D:/test.txt','a+') # a+(没有这个文件的情况下创建这个文件,如果存在就在文件中继续添加)
# print('123',file=fp)
# fp.close()
#######################################################################################################
# 转义字符
# print('hello\nworld') # \n换行打印
# print('hello\tworld') # \t代表4组空格
# print('hello\rworld') # \r之前的全删掉,输出world
# print('hello\bworld') # \b代表退一格,输出hellworld
# print('大家好:\'我是py\'') # 单引号中输出单引号
#######################################################################################################
# 原字符 (不希望专业字符起作用,就使用原字符,在字符串前加上r或R !!!最后一个字符不能是“\”)
# print(r'hello\nworld')
# print(R'hello\nworld')
#######################################################################################################
# 2进制 计算机只识别2进制 一共有2,8,10,16
# print(chr(0b100111001011000)) # 0b代表2进制
# print(ord('乘')) # ord()转化成10进制
# print(0o777) # 10进制
# print(0x1EAF) # 16进制
#######################################################################################################
# 关键字
# import keyword
# print(keyword.kwlist) # 输出所有关键字
#######################################################################################################
# 浮点数 (因计算机是2进制,浮点数计算可能不准确,可以使用一下方法)
# from decimal import Decimal
# print(Decimal('1.1')+Decimal('2.2'))
#######################################################################################################
# str 和 int 之间的类型转换
# name = 'xuhan'
# age = 18
# print('my name is' + name + ' ' + 'my age is' + ' ' + str(age))
#######################################################################################################
# input()
# a = input('请输入加数')
# b = input('请输入另一个加数')
# print(int(a)+int(b))
#######################################################################################################
# is is not
# a = 10
# b = 10
# print(a == b) # 是在比较value
# print(a is b) # 是在比较id
# print(a is not b) # a的id和b的id是不相等的吗
#######################################################################################################
# and or not
# a = 1
# b = 2
# c = True
# d = False
# print(a==1 and b==2)
# print(a==1 and b!=2)
# print(a==1 or b==2)
# print(a==1 or b!=2)
# print(not c)
# print(not d)
#######################################################################################################
# in not in
# a = 'abcd'
# print('a' in a)
# print('f' in a)
# print('a' not in a)
# print('f' not in a)
#######################################################################################################
# 位运算符
# print(4&8) # 按位与& 同为1时结果为1
# print(4|8) # 按位或| 同为0时结果为0
# print(4<<1) # 向左移动一位(移动一个位置),相当于乘以2
# print(4<<2) # 向左移动两位(移动两个位置),相当于乘以4
# print(4>>1) # 向右移动一位(移动一个位置),相当于除以2
# print(4>>2) # 向右移动两位(移动两个位置),相当于除以4
#######################################################################################################
# if elif else (多分支结构)
# num = int(input("请输入金额"))
# if 90<=num<=100:
# print('A')
# elif 80<=num<=89:
# print('B')
# else:
# print('C')
##########################
# if num < 0 or num > 100:
# print('非法数字')
# elif num <= 59:
# print('不及格')
# else:
# print('及格')
# identity = input('您是会员吗?y/n')
# num = int(input('输入消费金额'))
# if identity == 'y':
# if 100 <= num <= 200:
# input('ziyuanma')
# print('打8折')
# elif 0 <= num <= 99:
# print('打9折')
# elif identity == 'n':
# print('非会员')
#######################################################################################################
# 条件表达式
# a = int(input('输入a'))
# b = int(input('输入b'))
# print(str(a) + '大于等于' + str(b) if a >= b else str(a) + '小于' + str(b))
#######################################################################################################
# pass语句,什么都不做只是一个占位符,用到需要写语句的地方
# a = input('您是会员吗?y/n')
# if a == "y":
# pass
# else:
# pass
#######################################################################################################
# range()的三种创建方式
# 1.第一种创建方式,只有一个参数(小括号中只有一个数)
# r = range(10) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 默认从0开始,默认相差1,称为步长
# print(r) # range(0, 10)
# print(list(r)) # 用于查看range函数中的整数序列,
# 2.第二种创建方式,有两个参数
# r = range(1,5) # 指定了从1开始到5,但不包含5,默认步长为1
# print(r) # range(1, 5)
# print(list(r)) # [1, 2, 3, 4]
# 第三种创建方式,有三个参数
# r = range(1, 10, 2) # 第一个参数是起始位置,第二个参数是结束位置但不包含,第三个是步长
# print(list(r)) # [1, 3, 5, 7, 9]
# print(8 in r) # False
#######################################################################################################
# 判断条件表达式 while循环
# a = 1
# while a <= 4:
# print(a)
# a += a
#######################################################################################################
# 求0-4之间的累加和
# num = 0
# a = 0
# while a <= 4:
# num += a
# a += 1
# print(num)
#######################################################################################################
# 求1-100之间的偶数和
# num = 0
# a = 0
# while a <= 100:
# if not bool(a % 2): # 因为a%2是fasle,not 就是取不是false的就是true的
# num += a
# a += 1
# print(num)
#######################################################################################################
# 求0-100奇数的和
# num = 0
# a = 0
# while a <= 100:
# if a % 2: # 这个等于 a%2==0 因为0就是false false就进入判断中
# num += a
# a += 1
# print(num)
#######################################################################################################
# for in 循环
# for item in 'xuhan':
# print(item)
# for i in range(10):
# print(i)
# for _ in range(10): # 当你不需要打印每一次的值的时候,可以用 _ 来表示
# print('小徐最帅啦')
#######################################################################################################
# 使用for循环计算0-100的偶数累加和
# num = 0
# for item in range(1, 101):
# if not bool(item % 2):
# num += item
# print(num)
#######################################################################################################
# 使用for循环算数0-100基数的和
# num = 0
# for item in range(1,101):
# if bool(item%2):
# num+=item
# print(num)
#######################################################################################################
# 使用for循环算出100-999之间的水仙花数
# num = 0
# for item in range(100, 1000):
# ge = item % 10 # 个位
# shi = item // 10 % 10 # 十位
# bai = item // 100 # 百位
# if ge ** 3 + shi ** 3 + bai ** 3 == item:
# num += item
# item += 1
# print(num)
#######################################################################################################
# 流程控制语句break
# 从键盘录入密码,最多3次,正确结束循环
# num = 3
# for item in range(1, 4):
# b = input('请输入密码')
# if b == '3':
# print('输入正确')
# break
# else:
# num -= 1
# print('输入错误请重试,还剩余' + str(num) + '次')
#######################################################################################################
# while循环执行上面的需求
# a = 0
# while a < 3:
# b = input('请输入密码')
# if b=='3':
# print('登陆成功')
# break
# else:
# print('密码错误')
# a += 1
#######################################################################################################
# continue语句 用于结束当前循环,执行下一次循环,通常与分支中的if一起使用
# 要求算数0-50之间所有5的倍数 使用continue
# for item in range(1, 51):
# if bool(item % 5):
# continue
# print(item)
#######################################################################################################
# for 中的 else while中的else同理
# for item in range(3):
# b = input('请输入密码')
# if b == '3':
# print('输入正确')
# break
# else:
# print('密码不正确')
# else:
# print('3次机会已经用完')
#######################################################################################################
# 输出一个三行四列的矩形
# for item in range(3):
# for test in range(4):
# print('*',end="\t") # 不换行输出
# print() # 换行
#######################################################################################################
# 制作一个99乘法表
# for i in range(1,10): # 外行控制的是行数
# for j in range(1,i+1): # 内行控制的是打印的个数
# print(str(j),'*',str(i),'=',j*i,end="\t")
# print()
#######################################################################################################
# 二重循环中的break和contiune 只会对本层的循环有影响对外层的循环没有影响
# for i in range(5):
# for j in range(1,11):
# if j % 2 == 0:
# #break
# continue
# print(j, end="\t")
# print()
#######################################################################################################
# 列表list
# arr = ['a',1,'b',2,1,9]
# print(arr.index(1,2,5)) # 查找一个数组中有相同元素的方法
# print(arr.index(1)) # 若列表中有多个相同元素,只会返回第一个元素所在的索引
# print(arr)
# print(arr[0])
# print(arr[-4])
#######################################################################################################
# 列表切片
# arr = [10, 20, 30, 40, 50, 60, 70, 80]
# print(arr[1:6:1]) # start:end:步长,返回新数组 1是索引,6也是索引,到6停止但不包含6,1为步长
# print(arr[::-1]) # start和end默认的情况和步长为-1时,数组倒序
# print(arr[1:0:-1]) # 输出结果[20] 从索引1开始,步长为一往回走,到索引为0但是不包含0,就只剩20
#######################################################################################################
# 列表中的 in,not in
# arr = [1,'2',3]
# print(1 in arr) # True
# print(2 in arr) # False
# print(1 not in arr) # False
# print(2 not in arr) # True
#######################################################################################################
# 列表中的遍历 for in 循环
# arr = [1,'2',3,'4']
# for item in arr:
# print(type(item))
#######################################################################################################
# 列表元素的增加操作
# 1.append() 在列表末尾添加一元素
# 2.extend() 在列表末尾至少添加一个元素
# 3.insert() 在列表的任意位置添加一个元素
# 4.切片 在列表任意位置添加至少一个元素
# arr = [1,2,3,4]
# arr2 = [5,6]
# arr.append(arr2) # 不返回新数组 [1, 2, 3, 4, [5, 6]] !!!常用!!!
# arr.extend(arr2) # [1, 2, 3, 4, 5, 6]
# arr.insert(1,1.5) # [1, 1.5, 2, 3, 4] 1是索引,1.5是插入的值
# arr[1:] = arr2 # [1, 5, 6] 1是索引,把原数组的1之后的删掉,把新数组的内容添加进去
# print(arr)
#######################################################################################################
# 列表元素的删除操作
# 1.remove() 一次删除一个元素,重复元素只删除第一个,元素不存在抛出valueError
# 2.pop() 删除一个指定索引位置上的元素,指定索引不存在就抛出IndexError,不指定索引删除列表中最后一个元素
# 3.切片 一次最少删除一个元素,返回新数组
# 4.clear() 清空列表
# 5.del 删除列表
# arr = [1,2,3,4,1,5]
# arr.remove(1) # 只删除第一个1 [2,3,4,1,5]
# arr.pop(1) # 根据索引删除[1, 3, 4, 1, 5]
# arr2 = arr[1:3] # 返回新的数组 [2, 3] 返回的是切掉的内容
# print(arr2)
# arr[1:3] = [] # 不返回新列表的方法[1, 4, 1, 5]
# arr.clear() # 清空整个列表[]
# del arr # 删除整个列表NameError: name 'arr' is not defined
# print(arr)
#######################################################################################################
# 列表元素的修改操作
# arr = [1,2,3,4,5]
# arr[1] = 6 # [1, 6, 3, 4, 5]
# arr[1:3] = [9,5.5,8.032,'a'] # [1, 9, 5.5, 8.032, 'a', 4, 5]
# print(arr)
#######################################################################################################
# 列表元素的排序操作
# arr = [1,3.9,5,6,2,4,3,3.4,0.3]
# 1.sort() 列表排序方法,默认升序排序 不返回新数组。revrese=Ture降序排序
# 2.sorted() 内置函数,产生新的数组
# 区别:sort()对远列表进行排序,sorted()对新列表进行排序
# arr.sort() # [0.3, 1, 2, 3, 3.4, 3.9, 4, 5, 6]
# arr.sort(reverse=True) # [6, 5, 4, 3.9, 3.4, 3, 2, 1, 0.3] reverse=False就是升序排序
# arr2 = sorted(arr) # [0.3, 1, 2, 3, 3.4, 3.9, 4, 5, 6]
# arr2 = sorted(arr,reverse=True) # [6, 5, 4, 3.9, 3.4, 3, 2, 1, 0.3]
# print(arr2)
#######################################################################################################
# 列表生成式( 生成列表的公式)
# arr = [item for item in range(1,10)] # 最终列表存储的是i
# print(arr) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 生成列表为2,4,6,8,10
# arr = [i for i in range(2,11,2)]
# arr = [i*2 for i in range(1,6) ]
# print(arr)
#######################################################################################################
# 字典的创建
# obj = { # key值必须用引号引起来
# 'a':'12',
# 'b':13
# }
# obj = dict(name='xuhan', age=12) # key值必须不加引号
# print(obj)
#######################################################################################################
# 字典中获取数据
# 1.[]
# 2.get()
# 区别:当找一个对象中不存在的key值的时候,【】会返回KeyError,get()会返回None,输入默认值的话,会返回默认值
# dict = {
# 'name':'xuhan',
# 'age':18
# }
# print(dict['name']) # 必须加上引号xuhan
# dict = dict(name='xuhan',age=16)
# print(dict['age']) # 必须加引号16
# print(dict.get('name')) # 必须加引号xuhan
# print(dict.get('gender','没找到但是我默认是男')) # 当没有找到查找的key值的时候,返回默认值
#######################################################################################################
# key 的判断
# dict = dict(name='xuhan', age=16)
# print('name' in dict) # True
# print('name' not in dict) # False
# 字典元素的删除
# dict = dict(name='xuhan', age=16)
# del dict['name'] # {'age': 16} 删除指定的键值对 key:value
# dict.clear() # {} 清空字典
# print(dict)
# 字典元素的新值
# dict = dict(name='xuhan', age=16)
# dict['gender'] = '男'
# print(dict)
# 字典元素的修改
# dict = dict(name='xuhan', age=16)
# dict['name']='xuhan23'
# print(dict)
# 获取字典视图的3个方式
# dict = dict(name='xuhan', age=16)
# print(dict.keys()) # dict_keys(['name', 'age']) type为dict_keys
# print(dict.values()) # dict_values(['xuhan', 16]) type为dict_values
# print(dict.items()) # dict_items([('name', 'xuhan'), ('age', 16)]) type为dict_items
# 字典元素的遍历
# dict = dict(name='xuhan', age=16)
# for i in dict:
# print(i) # name age
# print(dict[i]) # xuhan 16
# print(dict.get(i)) # xuhan 16
# 字典生成式
# obj = ['name', 'age', 'gender']
# val = ['xuhan', 18, '男']
# dict = {obj.upper(): val for obj, val in zip(obj, val)} # {'NAME': 'xuhan', 'AGE': 18, 'GENDER': '男'} upper()变大写 zip()打包压缩
# print(dict)
#######################################################################################################
# 不可变序列和可变序列
# 可变序列 列表 字典 内存地址不会更改
# arr = [1,2,3]
# print(id(arr)) # 2084900910528
# arr.append(4)
# print(id(arr)) # 2084900910528
# 不可变序列 字符串 元组 内存地址发生更改
# font = 'ni'
# print(id(font)) # 1640823668336
# font = font + 'hao'
# print(id(font)) # 1640824975792
#######################################################################################################
# 元组
# 创建元组
# a = (1,2,'3',4.4) # 第一种创建方式,使用()
# a = tuple((4, 5, '6', 7.7)) # 第二种创建方式,使用内置函数tuple()
# a = (1,) # 若括号中只有一个数据的时候,结尾必须加上逗号
# print(a)
#######################################################################################################
# 元组为什么是不可变的
# tuple = (1,[2,3],4)
# tuple[1] = 5 # TypeError: 'tuple' object does not support item assignment
# tuple[1].append(6) # (1, [2, 3, 6], 4) 可以append因为列表是可变的,但是不能修改元组,元组是不可变的
# print(tuple)
#######################################################################################################
# 元组的遍历
# tuple = (1,23,56,8)
# for item in tuple:
# print(item)
#######################################################################################################
# 集合 可变类型序列 无序的,经过hash模式
# 集合的创建方式
# a = {1,2,3,1,2,3} # 使用{}创建,只有key,没有value {1, 2, 3} 自动过滤重复的元素 无序
# a = set(range(6)) # 使用set()内置函数创建 {0, 1, 2, 3, 4, 5} 自动过滤重复的元素 无序
# a = set([1,1,2,2,3,3]) # {1, 2, 3} 可以将列表中的元素转化成集合中的元素 自动过滤重复的元素 无序
# a = set((1,1,2,2,3,3,4)) # {1, 2, 3, 4} 可以将元组中的元素转化成集合中的元素 自动过滤重复的元素 无序
# a = set('helloeeee world') # {' ', 'w', 'o', 'l', 'd', 'r', 'e', 'h'} 可以将字符串中的元素转化成集合中的元素 自动过滤重复的元素 无序
# a = set({1,2,3,1,2,3}) # {1, 2, 3}
# print(a) # {1, 2, 3} 集合中的元素不可以重复
#######################################################################################################
# 定义一个空集合
# a = set()
# print(type(a)) #
#######################################################################################################
# 集合元素的判断操作in not in
# a = {1,3,5,7,9}
# print(1 in a)
# print(1 not in a)
# print(2 in a)
# print(2 not in a)
#######################################################################################################
# 集合元素的新增操作add() update()
# a = {1,2,3,4,5,6}
# a.add(1.7) # {1, 2, 3, 4, 5, 6, 1.7} 添加一个
# a.update({1,6,9}) # {1, 2, 3, 4, 5, 6, 9} 自动过滤重复的元素 列表 元组都可以添加 添加多个
# a.update('123',[8.6,5.2],(789,'da')) # {1, 2, 3, 4, 5, 6, '1', 8.6, '2', 5.2, 789, 'da', '3'}
# a.update(560) # TypeError: 'int' object is not iterable
# print(a)
#######################################################################################################
# 集合元素的删除操作
# 1.remove()一次删除一个指定元素
# 2.discard()一次删除一个指定元素
# 3.pop()一次只删除第一个元素
# 4.clear()清空集合
# a = {1,2,3,4,5,6}
# a.remove(2) # {1, 3, 4, 5, 6}
# a.remove(7) # KeyError: 7 没有这个元素会抛出异常
# a.discard(5) # {1, 2, 3, 4, 6}
# a.discard(7) # {1, 2, 3, 4, 5, 6} 没有这个元素不会抛出异常
# a.pop() # {2, 3, 4, 5, 6} 只能删除第一个元素,不能添加参数
# a.clear() # set()
# print(a)
#######################################################################################################
# 集合间的关系
# 判断两个集合是否相等
# a = {1, 2, 3, 5, 8}
# b = {2, 3, 8, 5, 1}
# print(a==b) # True 因为序列是无序的
# print(a!=b) # False
#######################################################################################################
# 判断一个集合是否是另一个集合的子集
# a = {1,2,3,4,5,6}
# b = {2,5,1}
# c = {1,2,4,9}
# print(b.issubset(a)) # True
# print(c.issubset(a)) # False
#######################################################################################################
# 判断一个集合是否是另一个集合的超集
# a = {1,2,3,4,5,6}
# b = {2,5,1}
# c = {1,2,4,9}
# print(a.issuperset(b)) # True
# print(a.issuperset(c)) # False
#######################################################################################################
# 判断两个集合是否没有交集
# a = {1,2,3,4,5,6}
# b = {2,5,1}
# c = {98,8,7}
# print(a.isdisjoint(b)) # False 语法意思是是否没有交集 返回False就是有交集
# print(c.isdisjoint(a)) # True 返回True就是没有交集
#######################################################################################################
# 集合的数学操作
# 1.交集
# a = {1,2,3}
# b = {2,3,4}
# print(a.intersection(b)) # {2, 3}
# print(a & b) # {2, 3} "&" 求交集的符号
# 2.并集
# a = {1,2,3}
# b = {2,3,4}
# print(a.union(b)) # {1, 2, 3, 4}
# print(a | b) # {1, 2, 3, 4} "|" 求并集的符号
# 3.差集
# a = {1, 2, 3}
# b = {2, 3, 4}
# print(a.difference(b)) # {1}
# print(b.difference(a)) # {4}
# print(a - b) # "-" 求差集的符号
# print(b - a)
# 4.对称差集
# a = {1, 2, 3}
# b = {2, 3, 4}
# print(a.symmetric_difference(b)) # {1, 4}
# print(b.symmetric_difference(a)) # {1, 4}
# print(a ^ b) # {1, 4} "^" 求对称差集的符号
#######################################################################################################
# 集合生成式
# a = {1,2,3}
# b = { i for i in range(6)}
# print(type(b)) # 无序的 !!!!
#######################################################################################################
# 字符串的创建与驻留机制
# a = 'a'
# b = 'a'
# c = 'a'
# print(id(a)) # 2247003362736
# print(id(b)) # 2247003362736
# print(id(c)) # 2247003362736
#######################################################################################################
# 字符串的查询
# a = 'abcdefgabcdefg'
# print(a.index('q')) # 查到字符串第一次出现的位置 如果没有返回ValueError: substring not found
# print(a.find('q')) # 查到字符串第一次出现的位置 如果没有返回-1
# print(a.rindex('b')) # 8 查到字符串最后一次出现的位置 如果没有返回ValueError: substring not found
# print(a.rfind('b')) # 8 查到字符串最后一次出现的位置 如果没有返回-1
#######################################################################################################
# 字符串大小写转换的方法
# 1.upper()转成大写
# 2.lower()转成小写
# 3.swapcase()把所有大写的元素转换成小写的,把所有小写的转化成大写的
# 4.title()把每个单词的首字符变成大写,其余的变成小写
# 5.capitalize()把一个字符转换成大写其余转换成小写
# a = 'abcdefgabcdefg'
# c = 'AbCdEfG'
# d = 'adSDl Adas lDF'
# b = a.upper() # 转成大写之后会产生一个新的字符串对象
# print(a) # abcdefgabcdefg
# print(b) # ABCDEFGABCDEFG
# print(b.lower()) # abcdefgabcdefg 转成小写之后会产生一个新的字符串对象
# s = c.swapcase() # 把所有大写的元素转换成小写的,把所有小写的转化成大写的
# print(s) # aBcDeFg
# x = d.title() # 把每个单词的首字符变成大写,其余的变成小写
# print(x) # Adsdl Adas Ldf
# j = d.capitalize() # 把一个字符转换成大写其余转换成小写
# print(j) # Adsdl adas ldf
#######################################################################################################
# 字符串内容对齐的方法
# 1.center()居中对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数是可选的,默认是空格,如果设置的宽度小于实际宽度则返回原字符串
# 2.ljust()左对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数是可选的,默认是空格,如果设置的宽度小于实际宽度则返回原字符串
# 3.rjust()右对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数是可选的,默认是空格,如果设置的宽度小于实际宽度则返回原字符串
# 4.zfill()右对齐,左边用0填充,该方法只接收一个参数,用于指定字符串的参数,如果设置的宽度小于实际宽度则返回原字符串
# a = 'hello world'
# print(a.center(20,'*')) # ****hello world***** 字符串长度是11,用(20-11)/2就是两边各占的字符
# print(a.ljust(20,'*')) # hello world********* 全部填充到右边
# print(a.rjust(20,'*')) # *********hello world 全部填充到左边
# print(a.zfill(20)) # 000000000hello world
# print('-8989'.zfill(8)) # -0008989 会加在-号的后面,算上-号一共8位
#######################################################################################################
# 字符串劈分操作
# 1.split()从字符串左侧开始劈分,默认劈分空格,返回的值是一个列表,通过参数sep指定分隔符,
# 通过参数maxsplit指定劈分字符串时最大的劈分次数,经过最大的劈分之后,剩余的字符串都会单独作为一部分。
# 2.rsplit()从字符串右侧开始劈分,默认劈分空格,返回的值是一个列表,通过参数sep指定分隔符,
# # 通过参数maxsplit指定劈分字符串时最大的劈分次数,经过最大的劈分之后,剩余的字符串都会单独作为一部分。
# a = 'name xuhan age 18'
# b = a.rsplit() # ['name', 'xuhan', 'age', '18']
# print(b)
# b = a.split() # ['name', 'xuhan', 'age', '18']
# print(b)
# a = 'name$xuhan$age$18'
# b = a.split(sep='$') # ['name', 'xuhan', 'age', '18'] sep="" 确定分割符
# b = a.split(sep="$",maxsplit=1) # ['name', 'xuhan$age$18'] maxsplit分割的段数
# print(b)
#######################################################################################################
# 判断字符串操作方法
# 1.isidentifier()判断是不是合法的字符串
# 2. isspace()判断指定的字符串是否全部由空白字符组成(回车,换行,水平制表符)
# 3. isalpha()判断指定的字符串是否全由字母组成
# 4. isdecimal()判断指定的字符串是否全部由十进制的数字组成
# 5. isnumeric()判断指定的字符串是否全部数字组成
# 6. isalnum()判断指定的字符串是否全部由字母和数字组成
# print('我爱你abc123_'.isidentifier()) # True
# print('\t'.isspace()) # True
# print('asd123'.isalpha()) # False
# print('徐晗'.isalpha()) # True
# print('452'.isdecimal()) # True
# print('1237891223'.isnumeric()) # True
# print('12378一二'.isnumeric()) # True
# print('12378一二'.isalnum()) # True
# print('1237!8一二'.isalnum()) # False
#######################################################################################################
# 字符串操作的其他方法
# 1.replace() 第一个参数是你要替换谁,第二个参数是你要替换后的内容,第三个参数是设定替换的次数
# 2.join()将列表或元组中的的字符串合并为一个字符串
# a = 'hello xuhan'
# print(a.replace('hello','zuishuai')) # zuishuai xuhan
# print(a.replace('xu','han')) # hello hanhan
# b = 'xu han han han'
# print(b.replace('han','6',2)) # xu 6 6 han
# list = ['123','456']
# a = ('dasd','xuhan')
# print(''.join(list)) # 123456
# print('@'.join(list)) # 123@456
# print('*'.join(a)) # dasd*xuhan
# print('^'.join('xuhanzuishuaila')) # x^u^h^a^n^z^u^i^s^h^u^a^i^l^a
#######################################################################################################
# 字符串的比较操作
# 1.运算符>,>=,<,<=,==,!= ord是查看原始值的,也就是原始值的比较 chr是用原始值查看本身值的,ord的反转
# 2.==和is的区别 ==比较的是值是否相等 is比较的是id是否相等
# print('old'>'older') # False
# print('red'>'green') # 114>103 True
# print(ord('r'),ord('g')) # 114 103
# print(chr(97),chr(98)) # a b 97就是a的原时值,98就是b的原始值
# print(ord('徐')) # 24464
# print(ord('晗')) # 26199
# print(chr(24464),chr(26199)) # 徐 晗
# a = b = 'xuhan'
# c = 'xuhan'
# print(a==b) # True
# print(a==c) # True
# print(b==c) # True
# print(a is b) # True
# print(a is c) # True
# print(b is c) # True
# print(id(a)) # 1896614936304
# print(id(b)) # 1896614936304
# print(id(c)) # 1896614936304
#######################################################################################################
# 字符串的切片操作
# 字符串是不可变的类型,不具备增,删,改等操作,切片操作将产生新的对象
# a = 'hello,china'
# b = a[:5]
# c = a[6:]
# d = b + '&' + c
# print(d) # hello&china
# print(a[1:5:2]) # el
# print(a[::2]) # hlocia是0 2 4 6 8 10怎么结的,步长为2,间隔就是1
# print(a[::1]) # hello,china,步长为1间隔就是0
# print(a[::-1]) # anihc,olleh 元素倒置
# print(a[-5:]) # china
#######################################################################################################
# 格式化字符串
# 1.%占位符
# 2.{}占位符
# 3.f-string占位符
# name = '徐晗'
# age = 18
# gender = '男'
# print('我叫%s,今年%d' % (name,age)) # 只能用%s和%d 我叫徐晗,今年18
# print('我叫{0},今年{1},性别{2}'.format(name,age,gender)) # 我叫徐晗,今年18,性别男 {0}代表的索引
# print(f'我叫{name},今年{age},性别{gender}') # 我叫徐晗,今年18,性别男
# print('%7d' % 7) # ' 7' 7代表宽度 总宽度是7
# print('%.2f' % 3.982) # 3.98,f代表小数,.2代表要保留2位小数
# print('%9.2f' % 8.63214) # ' 8.63' 同时加宽度和保留小数的方法 总宽度是9,保留3位小数
# print('{0:.3}'.format(3.1415926)) # 3.14 .3表示的是一共输出3位数 0是占位符
# print('{0:.3f}'.format(3.1415926)) # 3.142 .3f表示的是保留3位小数 0是占位符
# print('{0:10.3f}'.format(3.1415926)) # ’ 3.142‘ .3f表示的是保留3位小数 0是占位符 10代表一共占10位
#######################################################################################################
# 字符串的编码转换
# 编码
# s = '海上升明月'
# print(s.encode(encoding='GBK')) # 在GBK这种模式中 一个中文占两个字节 b'\xba\xa3\xc9\xcf\xc9\xfd\xc3\xf7\xd4\xc2' b表示2进制,后面表示1个字占两个字符
# print(s.encode(encoding='UTF-8')) # 在UTF-8这种模式中 一个中文占三个字节b'\xe6\xb5\xb7\xe4\xb8\x8a\xe5\x8d\x87\xe6\x98\x8e\xe6\x9c\x88'
# 解码
# a = '我本将心向明月,可耐明月照沟渠'
# b = a.encode(encoding='GBK')
# print(b.decode(encoding='GBK')) # 我本将心向明月,可耐明月照沟渠
# b = a.encode(encoding='UTF-8')
# print(b.decode(encoding='UTF-8')) # 我本将心向明月,可耐明月照沟渠
#######################################################################################################
# 函数的创建和调用
# def fun(a,b):
# c = a+b
# return c
# cale = fun(1,2)
# print(cale)
#######################################################################################################
# 函数的参数传递
# 1.顺序传参
# 2.关键字传参
# def fun(a,b):
# c = a+b
# return c
# func = fun(3,6)
# print(func)
# def fun(a,b):
# c = a+b
# return c
# func = fun(b=8,a=6) # a:6 b:8 # 只有在调用的时候赋值才是关键字传参
# print(func)
#######################################################################################################
# 函数的返回值
# 1.如果函数没有返回值(函数执行完毕之后,不需要给调用处提供数据),return可以省略不写
# 2.函数的返回值如果是1,直接返回原类型(是列表就返回列表是元组就返回元组)
# 3.函数的返回值如果是多个,返回的类型是一个元组
# 用函数写一个100以内返回奇数偶数的方法
# def fun(num):
# event = []
# odd = []
# for i in num:
# if i%2==0:
# event.append(i)
# else:
# odd.append(i)
# return event,odd
# a = fun(range(0,101))
# print(a)
# 没有返回值的情况
# def fun():
# print('你今天有点怪啊')
# fun()
# 返回值为1的
# def fun(a):
# a.append(5)
# return a
# b = fun([4,3]) # [4, 3, 5]
# print(b)
# a = input('lol')
# if a=='1':
# print('True')
# else:
# print('false')
# 函数参数定义
# 1.个数可变的位置参数
# 2.个数可变的关键字参数
# def fun(*res): # 函数定义时 可变的位置参数
# print(res)
# fun(10) # (10,)
# fun(10,50) # (10, 50)
# fun(10,50,80) # (10, 50, 80)
# def fun(**res):
# print(res)
# fun(a=1,b=2) # {'a': 1, 'b': 2}
# fun(a=3) # {'a': 3}
# fun(a="77",b=3.1415,c=range(0,1)) # {'a': '77', 'b': 3.1415, 'c': range(0, 1)}
# 变量的作用域
# def fun():
# global age # 函数内部定义的变量,使用global声明之后就变成了全局变量
# age = 18
# print(age)
# fun()
# 递归函数
# def fun(n):
# if n == 1:
# return 1
# else:
# return n * fun(n-1)
#
# print(fun(7))
# 递归实现斐波那契数列
# def fun(n):
# if n==1:
# return 1
# elif n==2:
# return 1
# else:
# res = fun(n-1)+fun(n-2)
# return res
# # print(fun(6)) # 8
# for i in range(1,7):
# print(fun(i)) # 1 1 2 3 5 8
#######################################################################################################
# 练习
# age = input('请输入您的真实年龄')
# if age >= '18':
# print('你成年了')
# else:
# print('未成年')
# for i in range(3):
# name = input('用户名')
# password = input('密码')
# if name == 'xuhan' and password == '123':
# print('success')
# break
# else:
# print('Error')
# else:
# print('3ci')
# arr = [
# {'name': '张三丰', 'age': 108, 'gender': '女'},
# {'name': ['张无忌','a'], 'age': 6, 'gender': '男'},
# {'name': ['张宇航', 'a'], 'age': 18, 'gender': '男'}
# ]
# answer = input('请输入你要搜索的内容')
# for item in arr:
# nameArr = item['name']
# if answer in nameArr:
# print(answer, '的年龄是', item['age'])
#######################################################################################################
# try except
# try:
# a = int(input('请输入一个整数'))
# b = int(input('请输入一个整数'))
# print(a / b)
# except ZeroDivisionError:
# print('0不能作为除数')
# except ValueError:
# print('不能是字符串')
#######################################################################################################
# try...except...else
# 如果try中的代码没有出现异常执行else中的代码,如果出现异常执行except中的代码
# try:
# a = int(input('请输入一个整数'))
# b = int(input('请输入一个整数'))
# c = a / b
# except BaseException as e:
# print(e)
# else:
# print(c)
#######################################################################################################
# try...except...else...finally
# finally块中的代码,无论是否异常都会执行,通常用来释放try中申请的资源
# try:
# a = int(input('请输入一个整数'))
# b = int(input('请输入一个整数'))
# c = a / b
# except BaseException as e:
# print(e)
# else:
# print(c)
# finally:
# print('欢迎下次光临')
#######################################################################################################
# traceback模块的使用
# import traceback
# try:
# print(10/0)
# except:
# traceback.print_exc()