零基础学python(二)

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 = 520def funB():x = 880print("In funB, x = ", x)funB()print("In funA, x = ", x)

调用funA,运行结果如下:

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

def funA():x = 520def funB():nonlocal xx = 880print("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 = 0while i <=/ 5:yield ii += 1

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

for i in counter():print(i)

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

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

def fbn():x = 0y = 1While True:yield xx, y = y, x + yf = 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.mzph.cn/news/870650.shtml

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

相关文章

【Unity2D 2022:UI】制作主菜单

一、创建主菜单游戏场景 1. 在Scenes文件夹中新建一个游戏场景Main Menu 2. 为场景添加背景 &#xff08;1&#xff09;创建画布Canvas &#xff08;2&#xff09;在Canvas中创建新的空游戏物体Main Menu &#xff08;3&#xff09;在Main Menu中新建一个图像游戏物体Backgrou…

无人机之机身保养

一、外观检查 1、检查机器表面整洁无划痕、无针孔凹陷擦伤、畸变等损坏情况&#xff1b; 2、晃动机身&#xff0c;仔细听机身内部有无松动零件或者螺丝在机身内部。 二、桨叶检查 1、有无裂痕、磨损、变形等缺陷&#xff0c;如有明显缺陷建议更换&#xff1b; 2、卡扣、紧…

Animate软件基础:图层的基本用法

图层作为Animate软件中比较重要的功能&#xff0c;需要对其使用方法和作用理解充分&#xff0c;并熟练操作才可以更好的用来制作内容。 图层相关的功能和用法如下&#xff1a; 图层可以帮助在文档中组织插图。 可以在一个图层上绘制和编辑对象&#xff0c;而不会影响其他图层…

排座椅【详细代码题解】

[NOIP2008 普及组] 排座椅 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳&#xff0c;这是令小学班主任十分头疼的一件事情。不过&#xff0c;班主任小雪发现了一些有趣的现象&#xff0c;当同学们的座次确定下来之后&#xff0c;只有有限的 D D D 对同学上课时…

USB转RS485+RS232+TTL串口电路

USB转RS485RS232TTL电路 USB转RS485RS232TTL电路如下图所示&#xff0c;可实现USB转RS485RS232TTL串口&#xff0c;一个电路模块即可实现电路调试过程中用到常用接口。 电路模块上留有2.54MM单排针接口和接线端子两种接线方式&#xff0c;可接线和跳线。电路模块同时有5V和3.3V…

开源浏览器引擎对比与适用场景:WebKit、Chrome、Gecko

WebKit与Chrome的Blink引擎对比 起源与关系&#xff1a; WebKit最初由苹果公司开发&#xff0c;用于Safari浏览器。后来&#xff0c;WebKit逐渐成为一个独立的开源项目&#xff0c;被多个浏览器厂商采用。Blink是Google基于WebKit项目分支出来的一个浏览器引擎&#xff0c;用于…

文献翻译与阅读《Integration Approaches for Heterogeneous Big Data: A Survey》

CYBERNETICS AND INFORMATION TECHNOLOGIES’24 论文原文下载地址&#xff1a;原文下载 目录 1 引言 2 大数据概述 3 大数据的异构性 4 讨论整合方法 4.1 大数据仓库&#xff08;BDW&#xff09; 4.2 大数据联盟&#xff08;BDF&#xff09; 5 DW 和 DF 方法的比较、分…

C++入门基础题:数组元素逆序(C++版互换方式)

1.题目&#xff1a; 数组元素逆置案例描述: 请声明一个5个元素的数组&#xff0c;并且将元素逆置. (如原数组元素为:1,3,2,5,4;逆置后输出结果为:4,5,2,3,1) 2.图解思路&#xff1a; 3.代码演示&#xff1a; #include<iostream>using namespace std;int main(){int a…

[k8s源码]1.client-go集群外部署

client-go是由k8s发布且维护的专门用于开发者和kubernetes交互的客户端库。它支持对k8s资源的CRUD操作&#xff08;create、read、update、delete&#xff09;&#xff0c;事件监听和处理&#xff0c;访问kubernetes集群的上下文和配置。 client go是独立于kubernetes集群之外…

Rust vs Go: 特点与应用场景分析

目录 介绍Rust的特点Go的特点Rust的应用场景Go的应用场景总结 介绍 Rust和Go&#xff08;Golang&#xff09;是现代编程语言中两个非常流行的选择。凭借各自的独特优势和广泛的应用场景&#xff0c;吸引了大量开发者的关注。本文将详细介绍Rust和Go的特点&#xff0c;并探讨它…

[Linux][Shell][Shell逻辑控制]详细讲解

目录 1.if 判断1.if-then2.if-then-else3.elif4.case5.实际上手 2.条件测试0.事前说明1.test 命令2.[]3.双括号1.(())2.[[]] 4.实际上手 3.循环1.for2.while3.until命令4.控制循环1.break2.continue 5.处理循环的输出 1.if 判断 1.if-then 语法&#xff1a;if command thenco…

大数据------JavaWeb------VueElement(完整知识点汇总)

Vue 定义 Vue是一套前端框架&#xff0c;可以免除原生JavaScript中的DOM操作&#xff0c;简化书写 之前所学的MyBatis框架是用来简化JDBC代码编写的&#xff1b;而Vue是前端框架&#xff0c;用来简化JavaScript代码编写的 在Axios与JSON综合案例的添加中有大量的DOM操作&#…

Ubuntu 22.04.4 LTS (linux) 安装 Auditd 安全审计

1 安装auditd sudo apt update sudo apt-get install auditd 2 修改配置 #sudo vim /etc/audit/auditd.conf #日志文件位置 log_file /var/log/audit/audit.log #日志文件大小(Mb) max_log_file 8 #日志文件数量 num_logs 53 启动服务 sudo systemctl restart aud…

【密码学】数字签名

一、数字签名的基本概念 数字签名是一种用于验证电子文档完整性和身份认证的密码学技术。它通过使用公钥加密体系中的私钥对文档的一部分&#xff08;通常是文档的摘要&#xff09;进行加密&#xff0c;从而创建一个“签名”。这个签名可以附在文档上&#xff0c;或作为一个单独…

如何将HEVC格式的视频转换为无损、未压缩的MP4格式视频?

在和大家分享视频格式转换之前&#xff0c;先跟大家分享一下HEVC格式的视频到底是什么文件&#xff1f;压缩原理是什么&#xff1f;了解了它的本质之后&#xff0c;我们就可以知道如何保证视频高清无损了。 如何将HEVC格式的视频转换为无损、未压缩的MP4格式视频&#xff1f; …

逐步实践复现 SELF-RAG

SELF-RAG 简介 SELF-RAG&#xff08;Self-Reflective Retrieval-Augmented Generation&#xff09;是一种检索增强生成&#xff08;RAG&#xff09;的框架&#xff0c;它通过自我反思学习检索、生成和批判&#xff0c;以提高大型语言模型&#xff08;LLM&#xff09;的质量和真…

通用业务指标管理系统设计

设计一个通用业务指标管理系统&#xff0c;旨在帮助企业全面监控和管理关键业绩指标(KPIs)&#xff0c;以驱动决策制定和业务优化。以下是一个综合性的设计方案&#xff0c;涵盖核心功能模块、技术架构、以及用户体验设计要点&#xff1a; 1. 核心功能模块 目标设定与分解 战…

「C++系列」一篇文章说透【存储类】

文章目录 一、C 存储类1. 类的定义2. 对象的创建3. 对象在内存中的布局4. 对象的存储位置 二、auto 存储类1. auto的基本用法2. auto与存储类的关系1) 自动存储类&#xff08;最常见的&#xff09;2) 静态存储类3) 动态存储类&#xff08;通过new&#xff09; 三、register 存储…

C标准库读写文件

函数介绍 库变量 变量描述size_t无符号整数类型&#xff0c;是sizeof关键字的结果&#xff0c;表示对象大小FILE文件流类型&#xff0c;适合存储文件流信息的对象类型 库宏 宏描述NULL空指针常量EOF表示已经到达文件结束的负整数stderr、stdin、stdout指向FILE类型的指针&a…

【数智化案例展】吉林省消防救援总队——基于大语言模型的119智慧助手

‍ 嘉诚信息案例 本项目案例由嘉诚信息投递并参与数据猿与上海大数据联盟联合推出的《2024中国数智化转型升级创新服务企业》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 随着信息时代的迅猛发展&#xff0c;消防人员正面临前所未有的知识爆炸挑战。为了高…