【10月更文挑战第11天】
1.数值类型
整型 int 整数 不可以修改的
浮点型 float 带小数点的数字 不可以修改的
布尔型 bool True(真1)、False(假0) 不可以修改的
2.序列类型(索引、切片)
字符串 str 用引号括起来的内容 不可以修改的(存在修改方法,但是会生成新的字符串)
列表 list [元素1,元素2] 可以修改
元组 tuple (元素1,元素2) 不可以修改的
3.散列类型
字典 dict {键:值,键:值} 可以修改
集合 set {元素1,元素2} 可以修改
题目
1.用户登录
如果用户名存在就输入密码,当密码正确的时候就显示登录成功并且退出程序
如果用户名不存在则提示用户注册
判断用户是否存在
存在---输入密码
不存在---提示用户注册
students =[
{'name':'张三','password':123},
{'name':'王五','password':888},
{'name':'赵六','password':456}
]
name=input("请输入用户名:")
for i in students:
#i存在的是用户的信息字典
if name==i['name']:
#对输入的用户名进行判断
for n in range(1,4):
#循环3次进行输入密码的操作,如果输入正确直接跳出循环
pwd=eval(input("请输入密码:"))
if pwd==i['password']:
print('登录成功')
exit()
#break#只能退出当前所在的循环,就是跳出了里面的循环,还是处于外部循环
else:
print(f'密码错误,还剩{3-n}次机会')
#if name==i['name'] and pwd==i['password'] :
break
else:#循环正常结束执行,即没有break语句
print("用户名不存在")
#对于这个程序的话,我们 不管输入什么最后都会打印这个用户名不存在
#我们内循环里面的break仅仅只够我们跳出内部循环
#但是没有跳出外部循环,这就是为什么会打印else的那句话
#那么我们就在外部循环加上一个判断语句,如果条件成立就直接跳出
#那么就不会进行这个循环后面的代码了
#总结,就是break只能退出当前所在的循环,所以在外边循环中我们需要再写一个break跳出外部循环
#对于后面的这个else语句来说
#循环正常结束执行,即没有break语句
#但是我们在内循环break的位置加一个exit()
#我们直接退出这个程序,那么就没有后面else的事了
#如果后面有代码的话,这个exit()影响到了后面代码的执行的话
#那么我们就使用break来跳出
#两个break
students =[
{'name':'张三','password':123},
{'name':'王五','password':888},
{'name':'赵六','password':456}
]
name=input("请输入用户名:")
for i in students:
#print(i)
if name in i.values():
#获取当前字典内的值
#我们在这里需要用到字典相关的函数--values去获取字典内的值
#查看当前遍历到的字典有没有我们输入的name
#print("存在")
for n in range(3):
pws=int(input("请输入密码:"))
if pws==i['password']:
print("登录成功")
exit()
else:
print(f"密码错误,还剩{3-n}次机会")
else:#循环正常结束才会执行
print("用户名不存在")
#在这个代码里面只有一个循环
#那么我们在break之后我们就不会触发这个else了,我们直接跳出循环了
#我们这里的break跳出循环是非正常循环的
2.数字重复统计:
'''
数字重复统计:
(1)随机生成1000个整数
import.random
random.randint
(2)数字的范围[20,100]
(3)升序输出所有不同的数字及每个数字重复的次数
'''
import random
li=[]#创建一个空列表
for i in range(1000):
num=random.randint(20,100)
print(num)
li.append(num)#我们将每次循环产生的数添加到这个列表中
print(li)
#升序输出所有不同的数字---去重(转换为集合),排序(sort)
li1=list(set(li))
#先转换为集合再转换为列表,我们就达到了去重的效果
print(li1)
li1.sort()#默认是从小到大,升序的
print(li1)
#每个数字重复的次数---统计数字出现的次数(序列.count(数据))
for i in li1:#遍历去重的列表
#进行统计,对没有机芯工去重的列表进行统计
x=li.count(i)
print(f'{i}出现了{x}次')
#我们所有的数字已经在li1里面了,而且没有重复的
#那么我们将这个列表作为外循环的条件进行遍历
#然后我们在li这个链表即兴每次遍历的数字的出现次数的计算
#我们需要将元素存储起来
#那么存放多个元素的有什么呢?
#列表、元组(不可修改)、字典(键值对)、集合
#那么最后只有列表和集合方便
#这个题的要求是还要统计重复数字的次数而且保存重复的数字
#那么我们直接将字典排除了
#因为字典是去重的
#那么最后我们就使用列表来对这些数字进行存储
我们在最后统计每个数字出现的次数
我们将每个数字进行去重
然后针对每个数字进行计数
通过这里的代码就会缩短时间
如果我们是对1000个数字一个一个进行遍历的话会很慢的
我们第一步直接将出现的数字缩水显现出来
然后我们再在原先的列表中进行遍历计算这个数字出现的次数
定义函数的语法
def 函数名 :
代码语句
函数的作用:我们把需要反复执行的程序封装起来,制作成一个可以反复调用的工具,这个工具在编程中就叫函数
对于不同情况我们就调用对应的函数,可以减少代码量
简单函数的创建:
#对于函数,函数内的代码前面要有一个缩进,表示这些代码是属于这个函数的
def test():
print("存款")
print("取款")
print("查询")
print("取卡")
#def是函数创建的一个关键词
注意:函数不会主动进行编译的,需要我们手动进行调用的
下面就是如何对函数的调用
我们在使用函数的时候直接就是函数名()
比如说int()要加括号才能执行
#那么我们在创建好函数之后我们怎么进行函数的使用呢?
#注意:函数不会主动进行编译的,需要我们手动进行调用的
#使用函数(调用函数)---函数名()
#对于这种调用的方法的话,我们之前的print() 和type()
#都是函数,只不过里面的代码我们是不需要写的,之前就写好了的,我们直接调用进行使用就行李科
test()
#这里我们成功调用函数
'''
存款
取款
查询
取卡
'''
使用函数之后我们的代码量就不会出现冗余的现象了
对于用户登录的题目我们是可以用函数的
注册:
#用户注册---reg
def reg():
name=input("请输入注册的用户名:")
while True:
p1=input("请输入密码:")
p2=input("请再次输入密码:")
if p1==p2:
students.append({'name':name,'password':p1})#p1是字符串我们得进行转换
print("注册成功")#那么我们就不用再输入密码了,我们就退出这个循环就行了
break
else:
print("两次密码要一致")
#直到我们输入正确的密码之后我们就能跳出这个循环了
登录:
#用户登录---log
def log():
name=input("请输入用户名:")
for i in students:
#i存在的是用户的信息字典
if name==i['name']:
#对输入的用户名进行判断
for n in range(1,4):
#循环3次进行输入密码的操作,如果输入正确直接跳出循环
pwd=input("请输入密码:")
if pwd==i['password']:
print('登录成功')
#exit()
break#只能退出当前所在的循环,就是跳出了里面的循环,还是处于外部循环
else:
print(f'密码错误,还剩{3-n}次机会')
if name==i['name'] and pwd==i['password'] :
break
else:
print("用户名不存在,请先注册")
那么我们在实现用户的登录和注册时候的场景就是下面这样的:
如果我们输入的没有注册的话就会提示我们进行注册的操作
#对于用户登录和用户注册我们是可以封装为两个函数的
students =[
{'name':'张三','password':'123'},
{'name':'王五','password':'888'},
{'name':'赵六','password':'456'}
]
#用户登录---log
def log():
name=input("请输入用户名:")
for i in students:
#i存在的是用户的信息字典
if name==i['name']:
#对输入的用户名进行判断
for n in range(1,4):
#循环3次进行输入密码的操作,如果输入正确直接跳出循环
pwd=input("请输入密码:")
if pwd==i['password']:
print('登录成功')
#exit()
break#只能退出当前所在的循环,就是跳出了里面的循环,还是处于外部循环
else:
print(f'密码错误,还剩{3-n}次机会')
if name==i['name'] and pwd==i['password'] :
break
else:
print("用户名不存在,请先注册")
#用户注册---reg
def reg():
name=input("请输入注册的用户名:")
while True:
p1=input("请输入密码:")
p2=input("请再次输入密码:")
if p1==p2:
students.append({'name':name,'password':p1})#p1是字符串我们得进行转换
print("注册成功")#那么我们就不用再输入密码了,我们就退出这个循环就行了
break
else:
print("两次密码要一致")
#直到我们输入正确的密码之后我们就能跳出这个循环了
while True:
n=input('1.登录 2.退出 3.提出\n请输入你要操作的内容')
if n =='1':
log()
elif n=='2':
reg()
elif n=='3':
print("退出")
break
else:
print("请输入正确的序号")
对于里面的while True
我们采用的是死循环,只要我们回答对了就跳出这个死循环
位置参数
函数参数包括形参和实参
实参就是我们传到函数的参数就是叫实参
形参就是函数用来接受我们传来的实参而创建的参数就是形参
形参:变量名,写在定义函数时的括号里面
实参:数据,写在调用函数时的括号里
传参:实参的数据给到形参的变量名
实参是写在调用函数的括号里面的哦
加法函数的创建:
#现在我们定义一个加法的函数
def Add(a,b):
print(a+b)
a=int(input("输入a:"))
b=int(input("输入b:"))
Add(a,b)
如果我们不传实参的话是会报错的
对于参数的话,我们实参和形参必须一一对应
关键字参数
函数名(形参=实参)
#我们这里直接指定好参数
print(sep='\t',end='\n')
#指定传参,这样就可以不用一一对应了
Add(b=100,a=10)
就是我们直接在调用函数的时候我们直接规定好参数的大小
那么我们就调用的时候就不需要参数一一对应上了
默认参数
作用:再调用函数时,默认参数没有传递值,就会使用我们设定好的默认值
'''
#默认参数
'''
def 函数名(形参=默认值,......):
函数体
'''
def func(name,sex='男'):
print(f'我是{name},性别:{sex}')
func("小黑")
#我是小黑,性别:男
#我们在这个函数的调用的时候我们只传了name"小黑"
#并没有传性别,因为我们性别在这个函数体中已经是默认的了
func("小美",'女')
我是小美,性别:女
对于默认参数的话,我们一开始在函数体里面已经设定好了他的值
后面我们调用这个函数的时候我们是不需要传这个默认参数的大小的
因为这个参数已经有值了,我们就不需要进行传递了
但是我们如果传了默认参数的值的话,我们就采用的是我们传的值
就像上面
小美是女生,我们的默认性别是男生,那么我们将性别女传上去,那么打印出来的就是“我是小美,性别:女”
对于函数中存在默认参数的看法
不传这个参数就是使用默认参数
但是如果传了参数的话,就是使用我们传的参数
对于函数参数的位置的话,我们需要先定义这个位置参数,然后定义默认参数
因为如果先定义默认参数的话,那么我们不传参的情况下位置参数就没有进行定义,就是会报错的
反正就是默认参数放在后面
不定长参数
不定长参数也叫可变参数,用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。
不定长参数 用于不确定调用时传递的实参个数
对于不定长参数的话,我们分为元组不定长和字典不定长
元组不定长---*args
#元组不定长---*args
def funa(*args):
print(args)#传入的数据全部存放在args中
funa()
#()
#我们不传参的话那么就是打印一个括号
#我们这里args前面加上*,就像是之前的变量前面加上*就能接受所有剩余的数据
#就像拆包一样
funa(1)
#(1,)
#我们传参1
#我们这里打印出来的就是一个元组类型的数据
#我们这个就是将传入的实参全部接受,以元组的方式进行保存
#不管传多少都是不会进行报错的
#这个不定长的参数就是保障了我们不知道参数个数的情况下降参数进行保存下来
那么数据是存储在元组里面
字典不定长---**kwargs
#字典不定长---**kwargs
#我们传入的数据以字典的方式进行存放
#字典{}
def funb(**kwargs):
print(kwargs)
funb()
#以关键字传参---形参(键)==实参(值)
funb(name="小敏",age=18)
#{'name': '小敏', 'age': 18}
#格式就是函数名字(键1=值1,键2=值2)
格式就是函数名字(键1=值1,键2=值2)
参数顺序
参数顺序:必备参数、默认参数、不定长参数
我们是一点要按照这种顺序进行定义的
不然是会出现报错的
参数的拆包
参数的拆包存在两种形式的
一种就是通过变量依次进行赋值
第二种就是直接在元组的前面加上*直接对这个元组进行拆包的操作
然后将拆包的结果当做实参传到函数里面
#定义一个元组
t=(1,2,3)
def func(a,b,c):
print(a,b,c,sep='\t')
#我们现在想让这个元组内的数据以实参的形式传到函数里面,那么该怎么操作呢?
#我们是可以使用拆包这个知识点
#拆包是存在两种形式的
#第一种:以变量的形式进行接收数据
'''
我们用变量的形式将这个元组内的数据依次进行接收
然后将这些变量以实参的形式传到这个函数里面
'''
x,y,z=t
func(x,y,z)
#1 2 3
#第二种:用*号进行接收
'''
在元组的名字前面加上*用于这个拆包,以实参的形式传到函数里面进行后续的操作
'''
func(*t)
#1 2 3
print(t)
#(1, 2, 3)
print(*t)
#1 2 3
#我们对元组进行拆包的操作之后我们就得到元组内的每个数据了