Day07课后有感
接昨天内容继续学习
昨日作业讲解:
1.编写一个用户登录程序
要求最多尝试失误三次 过期自动提示并可重置尝试次数
用户登录成功之后进入内部循环 用户输入什么就打印什么 并给用户提供一个结束程序的特殊指令
获取用户输入的用户名和密码可以处理首尾空格
用户的用户名和密码使用变量存储 通过程序获取用户名和密码比对
data = 'anna|666'
# 用户登录功能 获取用户输入 比对用户数据 # 1.定义类似于数据库的数据 source_data = 'anna|666' # 8.添加一个计数器 count = 1 # 5.添加循环 while True: # 9.判断当前尝试的次数 if count == 4: choice = input('您已经尝试三次了 是否继续(y/n)>>>:').strip() if choice == 'y': count = 1 else: print('欢迎下次使用') break # 2.获取用户输入的用户名和密码 username = input('username>>>:').strip() # TODO:自己可以结合自己的需求添加更多的校验 if len(username) == 0: print('用户名不能为空') continue password = input('password>>>:').strip() if len(password) == 0: print('密码不能为空') continue # 3.切割原始数据得到用户名和密码再比对 real_name, real_pwd = source_data.split('|') # real_name, real_pwd=['anna','666'] 解压赋值 # 4.校验用户名和密码 if username == real_name and password == real_pwd: print("登录成功") # 6.添加内层循环 while True: cmd = input('请输入您的指令>>>:').strip() # 7.添加一个结束条件 if cmd == 'q': break print('正在执行您的命令:%s' % cmd) else: print('用户名或密码') # 10.没错一次 计数器加一 count += 1
运行过程:
/usr/local/bin/python3.6 "/Users/jiligulu/py1/day07/01 作业讲解.py" username>>>:111 password>>>:11 用户名或密码 username>>>: 用户名不能为空 username>>>:11 password>>>: 密码不能为空 username>>>: 用户名不能为空 username>>>:anna password>>>:666 登录成功 请输入您的指令>>>:
字符串的其他内置方法
1.移除字符串首尾的指定字符 可以指定方向
s1 = '$$$anna$$$' print(s1.strip('$')) # anna 首尾都移掉 print(s1.lstrip('$')) # anna$$$ 去掉左边的$ left 左边 print(s1.rstrip('$')) # $$$anna 去掉右边的$ right 右边
运行结果:
anna anna$$$ $$$anna Process finished with exit code 0
2.大小写相关操作
s2 = 'JaSoN666Sb' print(s2.lower()) # 将所有的英文字母变为小写 jason666sb print(s2.upper()) # 将所有的英文字母变为大写 JASON666SB print(s2.islower()) # 判断字符串中所有的英文字母是否是纯小写 结果是布尔值 print(s2.isupper()) # 判断字符串中所有的英文字母是否是纯大写 结果是布尔值 '''图片验证码:一串有数字 大写字母 小写字母组成''' # 为什么以前的认证码需要一模一样 大小写不能忽略 现在的验证码却可以 如何实现 code = 'JaSOn6' print('这是返回给用户的图片验证码:%s' % code) user_code = input('请输入验证码>>>:').strip() if code.lower() == user_code.lower(): # 验证码忽略大小写 只需要统一转大写或者小写即可 print('验证码正确')
运行结果:
jason666sb JASON666SB False False 这是返回给用户的图片验证码:JaSOn6 请输入验证码>>>:jaSOn6 验证码正确 Process finished with exit code 0
3.判断字符串的开头或者结尾是否是指定的字符
s3 = 'jason kevin jason tony 666' print(s3.startswith('j')) # True print(s3.startswith('jason')) # True print(s3.startswith('tony')) # False print(s3.endswith('6')) # True print(s3.endswith('666')) # True print(s3.endswith('jason')) # False
4.格式化输出
# 方式1 占位符:%s %d # 方式2 format方法>>>:四种玩法 # 玩法1:跟占位符一致 使用的{}占位 print('my name is {} my age is {}'.format('jason', 18)) # 玩法2:根据索引取值 可以反复使用 print('my name is {0} {0} {0} my age is {0} {1}'.format('jason', 18)) # 玩法3:根据指名道姓的方式取值 print('my name is {name} {name} my age is {age} {pwd}'.format(name='jason', age=18, pwd=123)) # 玩法4:直接使用已经出现过的变量 name = 'jason' age = 18 print(f'my name is {name} my age is {age} {name} {age}') """python官网很久以前就说推荐使用format做格式化输出 甚至说%s要被砍掉"""
运行结果:
my name is jason my age is 18 my name is jason jason jason my age is jason 18 my name is jason jason my age is 18 123 my name is jason my age is 18 jason 18 Process finished with exit code 0
5.拼接字符串
s1 = '三月不努力 四月变垃圾'
s2 = '年少不努力 妄为少年人'
print(s1 + s2) # 如果字符串很大 加号效率较低
print(s1 * 10) # 重复次数
print('|'.join(s1)) # 三|月|不|努|力| |四|月|变|垃|圾
print('$'.join(['jason', 'kevin', 'justin', 'tony'])) # jason$kevin$justin$tony
'''join方法相当于是将括号内的元素进行for循环'''
l1 = ['anna', 'jason', 'kevin']
print('|'.join(l1)) # join的元素必须都是字符串才可以 否则报错
运行结果:
三月不努力 四月变垃圾年少不努力 妄为少年人
三月不努力 四月变垃圾三月不努力 四月变垃圾三月不努力 四月变垃圾三月不努力 四月变垃圾三月不努力 四月变垃圾三月不努力 四月变垃圾三月不努力 四月变垃圾三月不努力 四月变垃圾三月不努力 四月变垃圾三月不努力 四月变垃圾
三|月|不|努|力| |四|月|变|垃|圾
jason$kevin$justin$tony
anna|jason|kevin
6.替换字符串中指定的字符
s6 = 'jason is DSB DSB DSB DSB jason jason jason' # 将jason替换成老刘 print(s6.replace('jason', '老刘')) # 默认一次性替换所有 # 指定替换的个数 print(s6.replace('jason', '老刘', 2)) # 还可以通过数字控制替换的个数 从左往右 '''很多文本编辑器里面的替换功能 就可以使用replace完成'''
运行结果:
老刘 is DSB DSB DSB DSB 老刘 老刘 老刘 老刘 is DSB DSB DSB DSB 老刘 jason jason Process finished with exit code 0
7.判断字符串中是否是纯数字
s7 = 'jason123' print(s7.isdigit()) # False print('123'.isdigit()) # True print('123.21'.isdigit()) # False score = input('score>>>:') if score.isdigit(): score = int(score) else: print('你他喵的能不能好好写')
运行结果:
False True False score>>>:d 你他喵的能不能好好写 Process finished with exit code 0
以下为了解的操作:
# 1.查找指定字符对应的索引值 # s1 = 'jason justin kevin tony' # print(s1.find('s')) # 从左往右查找 查找一个就结束 # print(s1.find('k', 1, 9)) # -1 意思是没有 找不到 # print(s1.index('s')) # print(s1.index('k', 1, 9)) # 找不到直接报错 不推荐使用 # 2.文本位置改变 # name = 'tony' # print(name.center(30, '-')) # -------------tony------------- # print(name.ljust(30, '*')) # tony************************** # print(name.rjust(30, '$')) # $$$$$$$$$$$$$$$$$$$$$$$$$$tony # print(name.zfill(50)) # zero 零 0000000000000000000000000000000000000000000000tony # 3.特殊符号:斜杠与一些英文字母的组合会产生特殊的含义 # print('ja\tson\nke\avin') '''如果想取消它们的特殊含义 可以在字符串的前面加一个字母r''' # print(r'ja\tson\nke\avin') # 4.captalize,swapcase,title # 4.1 captalize:首字母大写 # message = 'hello everyone nice to meet you!' # message.capitalize() # Hello everyone nice to meet you! # 4.2 swapcase:大小写翻转 # message1 = 'Hi girl, I want make friends with you!' # message1.swapcase() # hI GIRL, i WANT MAKE FRIENDS WITH YOU! #4.3 title:每个单词的首字母大写 # msg = 'dear my friend i miss you very much' # msg.title() # Dear My Friend I Miss You Very Much
print(list('jason')) # ['j', 'a', 's', 'o', 'n'] print(list({'name': 'jason', 'pwd': 123})) # ['name', 'pwd'] 用for循环取k print(list((11,22,33,44,55))) # [11, 22, 33, 44, 55] print(list({1, 2, 3, 4, 5})) # [1, 2, 3, 4, 5]
print(list(True)) # 布尔值不能for循环,他只有单独一个
list可以转换支持for循环的数据类型
可以被for循环的数据类型:
字符串 列表 字典 元组 集合
2.常见操作(全部要记忆)
name_list = ['jason', 'kevin', 'tony', 'tom', 'jerry'] # 1.索引取值 print(name_list[0]) print(name_list[-1]) # 也支持负数取值
# 2.切片操作 print(name_list[1:4]) # ['kevin', 'tony', 'tom'] print(name_list[-4:-1]) # ['kevin', 'tony', 'tom'] print(name_list[-1:-4:-1]) # ['jerry', 'tom', 'tony'] #通过用负数改变方向就能取值了
# 3.间隔 print(name_list[0:4:1]) # ['jason', 'kevin', 'tony', 'tom'] print(name_list[0:4:2]) # ['jason', 'tony'] print(name_list[-1:-4:-1]) # ['jerry', 'tom', 'tony']
# 4.统计列表中元素的个数 print(len(name_list)) # 5 len出现频率较高,需要记住
# 5.成员运算 print('j' in name_list) # False 列表在做成员运算时,最小判断单位是元素,不是元素里面的单个字符 print('jason' in name_list) # True
以下是列表最最核心的内置方法:
6.列表添加元素的方式
print('j' in name_list) # False 列表在做成员运算时,最小判断单位是元素,不是元素里面的单个字符
print('jason' in name_list) # True
# 6.列表添加元素的方式
# 6.1.尾部追加'单个'元素
name_list.append('小李') # 添加一个元素在最末尾
print(name_list)
name_list.append([11, 22, 33, 44])
print(name_list) # 在append语法中,不论你括号里写什么都看成"单个"元素
# 6.2.指定位置插入'单个'元素
name_list.insert(0, 123) # 从左至右插在第一个位置
name_list.insert(2, '可不可以插个队') # 在任意位置插个队
name_list.insert(1, [11, 22, 33]) # 指定位置插入'单个'元素
print(name_list)
# 6.3.合并列表
name_list.extend([11, 22, 33, 44, 55])
print(name_list)
'''extend其实可以看成是for循环+append'''
for i in [11, 22, 33, 44, 55]:
name_list.append(i)
print(name_list)
name_list += [11, 22, 33, 44, 55]
print(name_list) # 加号的效率不高,数据量大的话比较占用空间
# 7.删除元素
# 7.1 通用的删除方式
del name_list[0]
print(name_list)
# 7.2 就地删除 # 指名道姓的直接删除某个元素
print(name_list.remove('jerry')) # None
print(name_list)
# 7.3 延迟删除
print(name_list.pop()) # 默认是尾部弹出 jerry
print(name_list)
print(name_list.pop(2)) # 还可以指定索引值 tony
print(name_list)
# 8.修改列表元素
print(id(name_list[0])) # 2614038082368
name_list[0] = 'jasonDSB'
print(id(name_list[0])) # 2614038926320
print(name_list)
# 9.排序
ss = [44, 77, 99, 11, 22, 33, 88, 66]
ss.sort() # 默认是升序
print(ss) # [11, 22, 33, 44, 66, 77, 88, 99]
ss.sort(reverse=True) # 可以修改尾降序
print(ss) # [99, 88, 77, 66, 44, 33, 22, 11]
# 10.翻转
ss = [44, 77, 99, 11, 22, 33, 88, 66]
ss.reverse() # 前后颠倒
print(ss)
# 11.比较运算
s1 = [11, 22, 33]
s2 = [1, 2, 3, 4, 5, 6, 7, 8]
print(s1 > s2) # True
"""列表在做比较的时候 其实比的是对应索引位置上的元素"""
# s1 = ['A', 'B', 'C'] # A>>>65
# s2 = ['a'] # a>>>97
# print(s1 > s2) # False
# ss = [44, 77, 99, 11, 22, 33, 88, 66]
# print(ss.index(99))
# 12.统计列表中某个元素出现的次数
l1 = [11, 22, 33, 44, 33, 22, 11, 22, 11, 22, 33, 22, 33, 44, 55, 44, 33]
# print(l1.count(11)) # 统计元素11出现的次数
l1.clear() # 清空列表
print(l1)
运行结果:
['j', 'a', 's', 'o', 'n']
['name', 'pwd']
[11, 22, 33, 44, 55]
[1, 2, 3, 4, 5]
jason
jerry
['kevin', 'tony', 'tom']
['kevin', 'tony', 'tom']
['jerry', 'tom', 'tony']
['jason', 'kevin', 'tony', 'tom']
['jason', 'tony']
['jerry', 'tom', 'tony']
5
False
True
['jason', 'kevin', 'tony', 'tom', 'jerry', '小李']
['jason', 'kevin', 'tony', 'tom', 'jerry', '小李', [11, 22, 33, 44]]
[123, [11, 22, 33], 'jason', '可不可以插个队', 'kevin', 'tony', 'tom', 'jerry', '小李', [11, 22, 33, 44]]
[123, [11, 22, 33], 'jason', '可不可以插个队', 'kevin', 'tony', 'tom', 'jerry', '小李', [11, 22, 33, 44], 11, 22, 33, 44, 55]
[123, [11, 22, 33], 'jason', '可不可以插个队', 'kevin', 'tony', 'tom', 'jerry', '小李', [11, 22, 33, 44], 11, 22, 33, 44, 55, 11, 22, 33, 44, 55]
[123, [11, 22, 33], 'jason', '可不可以插个队', 'kevin', 'tony', 'tom', 'jerry', '小李', [11, 22, 33, 44], 11, 22, 33, 44, 55, 11, 22, 33, 44, 55, 11, 22, 33, 44, 55]
[[11, 22, 33], 'jason', '可不可以插个队', 'kevin', 'tony', 'tom', 'jerry', '小李', [11, 22, 33, 44], 11, 22, 33, 44, 55, 11, 22, 33, 44, 55, 11, 22, 33, 44, 55]
None
[[11, 22, 33], 'jason', '可不可以插个队', 'kevin', 'tony', 'tom', '小李', [11, 22, 33, 44], 11, 22, 33, 44, 55, 11, 22, 33, 44, 55, 11, 22, 33, 44, 55]
55
[[11, 22, 33], 'jason', '可不可以插个队', 'kevin', 'tony', 'tom', '小李', [11, 22, 33, 44], 11, 22, 33, 44, 55, 11, 22, 33, 44, 55, 11, 22, 33, 44]
可不可以插个队
[[11, 22, 33], 'jason', 'kevin', 'tony', 'tom', '小李', [11, 22, 33, 44], 11, 22, 33, 44, 55, 11, 22, 33, 44, 55, 11, 22, 33, 44]
140514418835400
140514418835184
['jasonDSB', 'jason', 'kevin', 'tony', 'tom', '小李', [11, 22, 33, 44], 11, 22, 33, 44, 55, 11, 22, 33, 44, 55, 11, 22, 33, 44]
[11, 22, 33, 44, 66, 77, 88, 99]
[99, 88, 77, 66, 44, 33, 22, 11]
[66, 88, 33, 22, 11, 99, 77, 44]
True
[]
Process finished with exit code 0
s1 = '$$$jason$$$' print(s1.strip('$')) # jason 本身并没有修改 是产生了新的结果 print(s1) # $$$jason$$$ s2 = [1, 2, 3] print(s2.extend([11, 22, 33, 44, 55])) # None 空 print(s2) # [1, 2, 3, 11, 22, 33, 44, 55]
运行结果:
jason $$$jason$$$ None [1, 2, 3, 11, 22, 33, 44, 55] Process finished with exit code 0
可变类型 :列表
值改变 内存地址不变 修改的是本身
不可变类型 :字符串
值改变 内存地址肯定遍 修改过程产生了新的值
如何查看变量的'内存地址'
s2 = [1, 2, 3] print(id(s2)) s2.append(11111111) print(id(s2))
运行结果:
140243568505864 140243568505864 Process finished with exit code 0
字符串:
s1 = ' jason ' print(id(s1)) res = s1.strip() print(res) print(s1, id(s1))
jason jason 140496837230256 Process finished with exit code 0
队列: 先进先出 eg:超市排队结账 符合队列的特征
堆栈: 先进后出 eg:叠衣服 符合堆栈的特征 # 使用列表模拟出队列与堆栈的特征
# 使用列表模拟出队列与堆栈的特征
# 队列
new_list = []
# 先进
new_list.append(111)
new_list.append(222)
new_list.append(333)
# 先出
for i in new_list:
print(i)
print(new_list.pop(0))
print(new_list.pop(0))
print(new_list.pop(0))
# 堆栈
new_list = []
# 先进
new_list.append(111)
new_list.append(222)
new_list.append(333)
# 后出
print(new_list.pop())
print(new_list.pop())
print(new_list.pop())
运行结果:
111 222 333 111 222 333 333 222 111 Process finished with exit code 0