Python 散列类型三以及函数基础

简介: 【10月更文挑战第11天】

【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)

如果我们不传实参的话是会报错的

对于参数的话,我们实参和形参必须一一对应

image.png

关键字参数

函数名(形参=实参)

#我们这里直接指定好参数
print(sep='\t',end='\n')

#指定传参,这样就可以不用一一对应了
Add(b=100,a=10)

就是我们直接在调用函数的时候我们直接规定好参数的大小

那么我们就调用的时候就不需要参数一一对应上了

默认参数

作用:再调用函数时,默认参数没有传递值,就会使用我们设定好的默认值

'''
#默认参数
'''
def 函数名(形参=默认值,......):
    函数体

'''
def func(name,sex='男'):
    print(f'我是{name},性别:{sex}')

func("小黑")
#我是小黑,性别:男

#我们在这个函数的调用的时候我们只传了name"小黑"
#并没有传性别,因为我们性别在这个函数体中已经是默认的了

func("小美",'女')
我是小美,性别:女

对于默认参数的话,我们一开始在函数体里面已经设定好了他的值

后面我们调用这个函数的时候我们是不需要传这个默认参数的大小的

因为这个参数已经有值了,我们就不需要进行传递了

但是我们如果传了默认参数的值的话,我们就采用的是我们传的值

就像上面

小美是女生,我们的默认性别是男生,那么我们将性别女传上去,那么打印出来的就是“我是小美,性别:女”

对于函数中存在默认参数的看法

不传这个参数就是使用默认参数

但是如果传了参数的话,就是使用我们传的参数

对于函数参数的位置的话,我们需要先定义这个位置参数,然后定义默认参数

因为如果先定义默认参数的话,那么我们不传参的情况下位置参数就没有进行定义,就是会报错的

反正就是默认参数放在后面

image.png

不定长参数

不定长参数也叫可变参数,用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。

不定长参数 用于不确定调用时传递的实参个数

对于不定长参数的话,我们分为元组不定长和字典不定长

元组不定长---*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)

image.png

参数顺序

参数顺序:必备参数、默认参数、不定长参数

我们是一点要按照这种顺序进行定义的

不然是会出现报错的

参数的拆包

参数的拆包存在两种形式的

一种就是通过变量依次进行赋值

第二种就是直接在元组的前面加上*直接对这个元组进行拆包的操作

然后将拆包的结果当做实参传到函数里面

#定义一个元组
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

#我们对元组进行拆包的操作之后我们就得到元组内的每个数据了
相关文章
|
7天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
9天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1568 10
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
12天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
784 27
|
2天前
|
移动开发 JavaScript 前端开发
💻揭秘!如何用 Vue 3 实现酷炫的色彩魔方游戏✨
本文分享了开发基于Canvas技术的小游戏"色彩魔方挑战"的完整过程。游戏旨在考验玩家的观察力和耐心,通过随机生成的颜色矩阵和一个变化点,玩家需在两幅画布中找出不同的颜色点。文章详细讲解了游戏的核心功能,包括随机颜色矩阵生成、点的闪烁提示、自定义配色方案等。此外,作者展示了使用Vue 3和TypeScript开发的代码实现,带领读者一步步深入了解游戏的逻辑与细节。
103 68
|
2天前
|
存储 前端开发 JavaScript
🚀前端轻松实现网页内容转换:一键复制、保存图片及生成 Markdown
在现代前端开发中,提升用户的交互体验至关重要。本文将详细介绍如何使用 HTML2Canvas 和 Turndown 两个强大的 JavaScript 库,实现将网页选中文本转化为图片并保存或复制到剪贴板,或将内容转换为 Markdown 格式。文章包含核心代码实现、技术细节和功能拓展方向,为开发者提供了一个轻量级的解决方案,提升用户体验。
100 68
|
16天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
849 5
|
9天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
232 4
|
2天前
|
人工智能
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
121 1
|
6天前
|
并行计算 PyTorch TensorFlow
Ubuntu安装笔记(一):安装显卡驱动、cuda/cudnn、Anaconda、Pytorch、Tensorflow、Opencv、Visdom、FFMPEG、卸载一些不必要的预装软件
这篇文章是关于如何在Ubuntu操作系统上安装显卡驱动、CUDA、CUDNN、Anaconda、PyTorch、TensorFlow、OpenCV、FFMPEG以及卸载不必要的预装软件的详细指南。
475 2