零基础学python(二)

news2024/9/25 23:25:35

1. 字典

字典的创建

最常见的创建方式:

d = {"k1": "v1", "k2": "v2"}

再向字典中添加一对键值:

d["k3"] = "v3"

字典还可以用dict()创建,这种方式中,键是不加引号的: 

d = dict(k1=v1, k2=v2, k3=v3)

dict里面也可以是列表,列表的每一个元素是元组:

d = dict([("k1", "v1"), ("k2", "v2"), ("k3", "v3")])

还可以用zip函数创建字典

d = dict(zip(["k1", "k2", "k3"], ["v1", "v2", "v3"]))

还可以用dict的fromkeys方法创建字典,第一个参数是一个可迭代序列,代表字典的key,第二个参数是初始化字典所有key的值(如果不传,则所有值为None):

d = dict.fromkeys("Fish", 250)

使用pop方法删除指定而key:

d.pop("s")

pop一个不存在的键会抛出异常:KeyError

可以用popitem()随机删除一个键,Python 3.7之后,则是删除最后一个加入字典的键

使用del可以删除字典的键或者整个字典:

del d["I"]
del d

如果只是想清空字典的内容,使用clear方法:

d.clear()

如果想修改字典的多个键值对,可使用update方法:

d.update({"i": 250, "s": 250})
d.update(h=70, F=666)

如果需要设置某个键的值,如果存在该键,则不更新,如果没有,则设置为该值,此时需要使用setdefault()方法:

d.setdefault('c', 'code')

如果需要遍历字典的每一个key-value或者每一个key或者每一个value,则可以使用items()、keys()、values()方法,这三个方法返回的是字典的视图对象。使用list可以将key和value的视图对象转换为列表:

list(d.keys()) # 相当于list(d)
list(d.values())

字典也可以使用推导式,使用推导式将key和value反转过来:

b = {v:k for k,v in d.items()}
c = {v:k for k,v in d.items() if v > 100}
d = {x: ord(x) for x in "FishC"}

2. 集合

集合的基础创建方法、特征、使用方法等不在此介绍,这里介绍一些进阶的操作。

检测两个集合之间是否毫不相关,使用isdisjoint方法:

s = set("FishC")
s.isdisjoint(set("Python"))

 结果是False,因为他们有共同的h。disjoint方法不必传入集合,只要传入可迭代对象即可:

s = set("FishC")
s.isdisjoint("Java")

检测一个集合是否为另一个集合/可迭代对象的子集:

s.issubset("FishC.com.cn")

检测一个集合是否为另一个集合/可迭代对象的超集(父集): 

s.issuperset("Fish")

计算并集、交集、差集、对称差集: 

s.union({1, 2, 3}) # 并集
s.intersection("Fish") # 交集
s.difference("Fish") # 差集
s.symmetric_difference("Python") # 对称差集,相当于并集 - 交集

除了使用集合的方法确定子集和超集,以及计算并集、交集、差集、对称差集,也可以使用运算符确定子集和超集,以及计算并集、交集、差集、对称差集:

s >= set("Fish") # 是否是超集
s < set("Fish.com.cn") # 是否是子集
s | set("Python") # 并集
s & set("Python") # 交集
s - set("Python") # 差集
s ^ set("Python") # 对称差集

值得注意的是,使用方法时,方法的参数只要是可迭代对象即可,但是使用运算符,运算符两边都要为集合。

Python中的不可变集合:frozenset

s = set("FishC")
t = frozenset("FishC")

尝试使用update方法更新集合的元素:

s.update([1, 1], "23") # 不报错
t.update([1, 1], "23") # 报错

 update方法传入的是可迭代对象,是更新一系列的值,如果只想添加单个元素,可以使用add方法:

s.add("45")

注意,上述代码会将45作为一个整体字符串插入集合,而不是插入4和5。

删除集合的元素:remove和discard:

s.remove("xxx")
s.discard("xxx")

两者的区别在于,如果元素不存在,remove方法会报错,discard方法不会报错

随机从集合弹出一个元素:pop

s.pop()

注意只有可哈希的对象才能作为字典的key和集合的元素,比如字符串,数字,元祖,但是列表不可以作为字典的key和集合的元素,列表是可变数据类型,是不可哈希的。所以嵌套集合一般是不可以的,因为集合也是可变的数据类型。如果非要嵌套集合,可以使用frozenset,即集合里嵌套frozenset。

3. 函数的参数

python函数的传参分为位置参数和关键字参数两种,比如如下函数定义:

使用位置参数调用:

使用关键字参数调用:

如果要混合使用关键字参数和位置参数,位置参数必须在关键字参数之前

另外默认参数必须放在非默认参数的后面(函数定义时需要满足此规则)。

函数定义时,有时会看到参数为/,这表示/左边的参数必须是位置参数,不能是关键字参数:

/右边的参数可以是位置参数,也可以是关键字参数。

*则相反,*右边的参数必须是关键字参数,*左边的参数可以是位置参数,也可以是关键字参数:

如果可变参数(一般是*args表示)后面还有参数,则传参时必须用关键字参数,否则后面传的参数也会被认为是可变参数:

​​​​​​​ 

4. 函数的嵌套与闭包

函数如果嵌套,内层函数是无法直接修改外层函数的变量,这有点像一个函数内无法直接修改全局变量一样:

def funA():
    x = 520
    def funB():
        x = 880
        print("In funB, x = ", x)
    funB()
    print("In funA, x = ", x)

调用funA,运行结果如下:

类似于引入global变量,这里引入nonlocal变量,就可以在funB中修改funA的变量了:

def funA():
    x = 520
    def funB():
        nonlocal x
        x = 880
        print("In funB, x = ", x)
    funB()
    print("In funA, x = ", x)

对于函数的嵌套,如果内层函数(一段代码处理逻辑)使用到了外层函数的变量(相当于外层函数的局部变量),然后外层函数的返回值恰好是内层函数本身,那么调用外层函数就可以获得内层函数的引用,并且里面相当于间接的永久保存了外层函数的局部变量,这就是闭包。

如上图代码中,funA调用完毕之后,其中的局部变量x的生命周期理论上已经结束,但是再次调用funny(),却能够打印x的值。这就是闭包的好处:外层函数的作用域可以通过内层函数间接永久保存下来。

如果内层函数使用nonlocal语句修改外层函数的变量,那就更有意思了(坐标移动):

5. 装饰器

装饰器的原理就是将函数作为参数传递给另一个参数,举个例子:

import time
def time_master(func):
    print("开始运行程序")
    start = time.time()
    func()
    stop = time.time()
    print("结束程序运行")
    print(f"一共耗费了{(start - stop):.2f}秒")
    
def myfun()
    time.sleep(2)
    print("Hello")

time_master(myfunc())

如果每次想要知道函数的运行时间,都要显示地调用time_master,显然比较麻烦,如果能放函数执行时自动统计运行时间,就很方便了,此时就需要用到装饰器:

import time
def time_master(func):
    def call_func():
        print("开始运行程序")
        start = time.time()
        func()
        stop = time.time()
        print("结束程序运行")
        print(f"一共耗费了{(start - stop):.2f}秒")
    return call_func()
    
@time_master
def myfun()
    time.sleep(2)
    print("Hello")

myfunc()

装饰器的原理就是将被装饰的函数作为参数传进装饰器函数中,相当于:

myfunc = timemaster(myfunc)

多个装饰器可以装饰同一个函数,执行顺序是从下至上:

运行结果是65。

给装饰器传参数,需要再加一层嵌套,第一层函数传递参数,第二层函数传递函数:

6. 生成器

定义生成器很简单,在函数中使用yield代替return语句就可以了:

def counter():
    i = 0
    while i <=/ 5:
        yield i
        i += 1

调用函数不会得到i的值,会得到一个生成器,如果要获取生成器的值,使用for语句:

for i in counter():
    print(i)

 生成器可以看成一个特殊的迭代器,每调用一次产生一个数据,并暂停,可以使用next函数获取其值:

使用生成器产生斐波那契数列:

def fbn():
    x = 0
    y = 1
    While True:
        yield x
        x, y = y, x + y

f = fnb()
next(f)
next(f)
next(f)
next(f)
next(f)

元祖的推导式是一个生成器,所以元祖的推导式也叫生成器表达式:

t = (i ** 2 for i in range(10))

 

7. 函数文档

使用help函数查看函数的功能帮助:

 

help函数的输出其实是函数的文档,用""" """"包裹:

 

也可以使用函数名.__doc__查看函数文档(带有\n换行符,建议用print查看):

通过函数名.__annotations__查看参数类型注释:

 

 8. 偏函数和@wraps装饰器

偏函数就是让函数的多个参数分开传递,每次传递一个参数就可以得到一个新的函数:

 使用装饰器可以丰富函数的功能,但是会有副作用,改变函数的__name__属性:

 

查看myfunc.__name__,结果竟然是call_func,本质是因为使用了装饰器之后,等同于myfunc = time_master(myfunc),所以是call_func。为了解决这个问题,需要使用@wraps装饰器:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1920350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式工程师从0开始,到底该学什么,怎么学?

作为嵌入式工程师&#xff0c;从零开始学习需要掌握以下几个关键方面。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕设800套和语言类教学&#xff0c;敲个22就可以免费获得。 基…

WPS打开PDF文件的目录

WPS打开PDF文件的目录 其实WPS中PDF文件并没有像Word那样标准的目录&#xff0c;但是倒是有书签&#xff0c;和目录一个效果 点击左上角书签选项&#xff0c;或者使用Alt Shift 1快捷键即可

java解决实例问题--拿硬币堆

题目&#x1f38a; 编程梦想家&#xff08;大学生版&#xff09;-CSDN博客 桌上有 n 堆力扣币&#xff0c;每堆的数量保存在数组 coins 中。我们每次可以选择任意一堆&#xff0c;拿走其中的一枚或者两枚&#xff0c;求拿完所有力扣币的最少次数。 ❤ 这个问题实际上是一个贪…

【简历】西安某211大学研究生:Java简历面试通过率低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这个同学是211研究生的一份Java简历,这个简历版面没有问题,但是因为主项目重复度过大,所以导致这个简历的简历通过率会大大降低,面试通过…

《Windows API每日一练》9.2.1 菜单

■和菜单有关的概念 窗口的菜单栏紧挨着标题栏下面显示。这个菜单栏有时叫作程序的“主菜单”或“顶级菜单“&#xff08;top-level menu&#xff09;。顶级菜单中的菜单项通常会激活下拉菜单&#xff08;drop-downmenu&#xff09;&#xff0c;也 叫“弹出菜单”&#xff08;…

头歌资源库(25)地图着色

一、 问题描述 任何平面区域图都可以用四种颜色着色&#xff0c;使相邻区域颜色互异。这就是四色定理。要求给定区域图&#xff0c;排出全部可能的着色方案。例如&#xff0c;区域图如下图所示&#xff1a; 要求用四种颜色着色。 则输入&#xff1a; 10 4 &#xff08;分别表示…

什么是敏捷本地化

快速、敏捷的多语言产品和服务交付正逐渐成为众多行业的常态。在这种情况下&#xff0c;重点从传统的期望&#xff08;即在合理的时间框架内翻译大量内容&#xff09;转变为翻译工作量非常大的小片段&#xff0c;通常在2-3到12-24小时之间&#xff0c;通常在周末或假期。 Logr…

如何做好漏洞扫描工作提高网络安全

在数字化浪潮席卷全球的今天&#xff0c;企业数字化转型已成为提升竞争力、实现可持续发展的关键路径。然而&#xff0c;这一转型过程并非坦途&#xff0c;其中网络安全问题如同暗礁般潜伏&#xff0c;稍有不慎便可能引发数据泄露、服务中断乃至品牌信誉受损等严重后果。因此&a…

usbserver工程师手记(三)手工开通 OTP功能

1、设定密钥&#xff0c;用户自行选择一个密钥&#xff0c;以下以密钥为 EAZAYOKNGETBOPC5 为例说明 2、usb server 配置otp 密钥&#xff0c;目前还没有UI 界面开通&#xff0c;后续版本会支持从管理界面开通 curl -X POST -H Content-Type: application/json -H Accept: app…

mysql高可用解决方案:MHA原理及实现

MHA&#xff1a;Master High Availability。对主节点进行监控&#xff0c;可实现自动故障转移至其它从节点&#xff1b;通过提升某一从节点为新的主节点&#xff0c;基于主从复制实现&#xff0c;还需要客户端配合实现&#xff0c;目前MHA主要支持一主多从的架构&#xff0c;要…

应力平衡方程的推导

应力平衡方程的推导 对于一点&#xff0c;已知其应力状态有&#xff1a; σ x , τ x y , τ x z \sigma_x,\tau_{xy},\tau_{xz} σx​,τxy​,τxz​ 则其附近点的应力状态为&#xff1a; σ x ∂ σ x ∂ x d x , τ x y ∂ τ x y ∂ x d x , τ x z ∂ τ x z ∂ x d …

【JavaScript 报错】未捕获的范围错误:Uncaught RangeError

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、错误原因分析1. 递归调用次数过多2. 数组长度超出限制3. 数值超出允许范围 二、解决方案1. 限制递归深度2. 控制数组长度3. 检查数值范围 三、实例讲解四、总结 Uncaught RangeError 是JavaScript中常见的一种错误&…

2024年06月CCF-GESP编程能力等级认证C++编程三级真题解析

本文收录于专栏《C等级认证CCF-GESP真题解析》&#xff0c;专栏总目录&#xff1a;点这里。订阅后可阅读专栏内所有文章。 一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级&…

IO模型理论学习

1、什么是IO 计算机视角下的io AIO

Redis命令详解以及存储原理

Redis是什么 远程字典服务 分布式场景重的一个单独的节点。请求回应的模式&#xff1a;发起请求&#xff0c;处理之后得到回应的结果。字典的形式存储&索引数据。 内存数据库 数据在内存中&#xff0c;不可以出现需要的内存不在内存中而在磁盘中速度快&#xff0c;内存100…

智能家居开发新进展:乐鑫 ESP-ZeroCode 与亚马逊 ACK for Matter 实现集成

日前&#xff0c;乐鑫 ESP-ZeroCode 与亚马逊 Alexa Connect Kit (ACK) for Matter 实现了集成。这对智能家居设备制造商来说是一项重大进展。开发人员无需编写固件或开发移动应用程序&#xff0c;即可轻松设计符合 Matter 标准的产品。不仅如此&#xff0c;开发者还可以在短短…

goaccess分析json格式日志

一.安装使用yum安装&#xff0c;yum install goaccess 二.主要介绍格式问题 1.nginx日志格式如下&#xff1a; log_format main escapejson {"time_local":"$time_local", "remote_addr":"$remote_addr", "r…

C:数据结构---算法

1.1排序算法 稳定排序 不稳定排序 ①冒泡排序&#xff08;稳定&#xff09; 比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。对每一对相邻元素作同样的工作&#xff0c;从开始第一对到结尾的最后一对 ②选择排序 在未排序序列中找到最小&#xff08;大…

2.The DispatcherServlet

The DispatcherServlet Spring的Web MVC框架与许多其他Web MVC框架一样&#xff0c;是请求驱动的&#xff0c;围绕一个中央Servlet&#xff08;即DispatcherServlet&#xff09;设计&#xff0c;该Servlet将请求分派给控制器&#xff0c;并提供其他功能以促进Web应用程序的开发…

sqlmap使用之-post注入、head注入(ua、cookie、referer)

1、post注入 1.1、方法一&#xff0c;通过保存数据包文件进行注入 bp抓包获取post数据 将数据保存到post.txt文件 加上-r指定数据文件 1.2、方法二、通过URL注入 D:\Python3.8.6\SQLmap>python sqlmap.py -u "http://localhost/login.php" --data "userna…