[学习总结] python语言学习总结 (二)
1.python中的拆包
之前就只写了*可以是未知数量的参数,**可以传入未知数量命名参数。这次详细记下拆包。
def f1(a, *l):
print(a)
# 不拆包
print(l)
# 拆包
print(*l)
f2(l)
f2(*l) def f2(*l):
print(l)
print(*l) def f3(**kw):
# 不拆包
print(kw)
# 得到键名
print(*kw)
# 拆包,键名对应
f4(**kw)
# 注意,python中没办法输出**kw,不信可以自己试试。。 def f4(a, b):
print(a, b) f3(a=1, b=2) f1(1, 2, 3) '''
{'a': 1, 'b': 2}
a b
1 2
1
(2, 3)
2 3
((2, 3),)
(2, 3)
(2, 3)
2 3
'''
我试图通过这段代码的运行情况搞清楚拆包,实际上结果也特别明显。
其实python给f1和f2函数传入的参数是个元组,也就是形式参数被转换为元组传入了f1和f2中作为实参,这应该是函数给我们做的装包工作,这个工作对我们在函数里操作是很方便的,而从未拆包和拆包的f2的输出来看,我们的理解是正确的。
同样的,**kw传入的参数其实是个字典,传入之后会隐式地进行装包工作,也就是将a=1,b=2装包成{'a':1,'b':2}的字典,这样方便了我们在函数中提取相应参数,我觉得还是很有用的。需要注意的是,我们无法通过print(**kw)得到a=1,b=2的输出结果,因为print函数貌似不支持这种输出,可以自己尝试下。而从f4的输出看出,我们的理解是正确的。
因此,我们可以在以下场景用到拆包操作。
1.我们有一个元组,想把这个元组的数据分别作为参数传入。其实就是上面f2函数实现的。
2.我们有一个字典,想把这个字典的数据分别作为参数传入。其实就是上面f4函数实现的。
2.python中的切片
说实在话,切片用到的次数非常多,因为经常操作字符串、list和numpy,所以这个东西用到的次数非常多。
以一个简单的字符串为例
str = "abcdefg" print(str[0:2:1], str[0:2:-1], str[:], str[::-1], str[::-2]) '''
ab abcdefg gfedcba geca
'''
切片最常用的是一个左右中括号的操作;通过指定的下标来访问一组序列的元素,其实就切片操作。
中括号中我们可以指定三个参数,其中第一个参数代表要取的序列的起始index,我们选0,就是从最开始选,第二个参数是结束index,但是不包含这个index对应的数据,从以上输出中我们是可以看出来的,第三个参数是步长,步长为1,那么他就从左往右一个一个取;步长为-1,那么他就从右往左一个一个取,步长为负就是反方向取,因此我们可以填-2,那么他就从右往左以两个步长取元素。
其中呢,后面的冒号是可以省略的,也就是可以不填步长,默认就是1,只有一个冒号而不填任何参数就是复制这个序列,而前两个参数空,只把步长设为1其实就是倒置这个序列。
3.python中的名称空间
python中的名称空间我觉得还是要搞清楚的,这样对理解python这门语言还是很有帮助的。
名称空间(namespace):名称空间是名字和对象的映射。也就是可以把一个namespace理解为一个字典,实际上很多当前的Python实现namespace就是用的字典。各个名称空间是独立的,没有任何关系的,所以一个名称空间中不能有重名,但不同的名称空间是可以重名而没有任何影响。
Build-in
....Global
........Enclosed
............Local
可见确实是个层级关系。
我们来分别解释这四个名称空间,
Build-in:python解释器启动产生的字典,用于存放python内置的名字。
Global:执行python文件时,存放文件级定义的名字,就是被import的时候创建,在解释器退出的时候才被删除。
Enclosed:指的是一个函数被另一个函数包含时的命名空间。
Local:执行文件过程中,调用函数时产生的名称空间,用来存放函数内定义的名字,由于生命周期的原因,函数调用结束后该名字会被删除。
Python在查找变量时候按照从内至外的顺序查找变量,可以说成是LEGBD顺序。
作用域(scope):作用域是Python程序(文本)的某一段或某些段,在这些地方,某个命名空间中的名字可以被直接引用。这个作用域就是这个命名空间的作用域。
下面用代码来理解一下作用域。
from copy import copy
a = 5
print("***build-in and globals***")
# print(type(list(globals().keys())))
globals_init = copy(list(globals().keys()))
print("\n".join(globals_init)) # 输出的是build-in的命名空间下的名字key def f1(b=3):
c = 4
print("***globals in f1***", *(globals().keys() - globals_init), sep="\n")
# 解释下这里,globals().keys()返回的是list,list相减得到的是set,然后对set解包就可以输出了,也可以把set转化为list用.join输出
print("***locals in f1***", *(locals().keys()), sep="\n") def f2():
c = 5
print("***locals in f2***", *(locals().keys()), sep="\n")
print("c=", c)
f2()
print("c=", c) def f3():
nonlocal c
c = 6
print("***locals in f3***", *(locals().keys()), sep="\n")
print("c=", c)
f3()
print("c=", c) f1() '''
***build-in and globals***
__name__
__doc__
__package__
__loader__
__spec__
__annotations__
__builtins__
__file__
__cached__
copy
a
***globals in f1***
globals_init
f1
***locals in f1***
b
c
c= 4
locals in f2
c
c= 4
c= 4
locals in f3
c
c= 6
'''
咱们从这里可以看出,不同作用域对应的名称是相互独立的,在函数内如果和函数外有相同的变量名称,会默认把近的那个作为要找到的变量,如果要访问函数外的比如a怎么办呢,很简单,函数里面写上global a 即可,否则你的操作就相当于在函数内的local里建立了一个新变量。函数嵌套的时候使用nonlocal去操作被套函数外的local变量,甚至也可以通过global操作全局变量。上面的例子仔细看看应该是理解了。
4.python中的一些高阶函数总结
分别是map、filter、reduce、sorted。其中sorted函数之前已经写过了,但是当时没有用到参数key,这次查了一下,发现key就是自定义排序规则,比如我们让key=abs,那么就会按照绝对值大小排序,当然我们也可以自定义函数,我这里用lambda定义了匿名函数来对x平方大小排序,然后映射回原list。map函数通过建立一个映射,对后面的range通过调用前面的匿名函数形成一个数值映射,然后得到map结果,我们将这个结果转为list输出。filter在map的基础上呢,相当于加上了一层判断,其实filter也会对后面的list生成一个值的映射,但是filter会利用函数作为参数做一层判断,保留满足条件的结果。reduce函数呢,可以允许我们两两调用函数参数,最终只得到一个结果(如例子),这个例子的计算结果其实是1*2*3*4=24也就是也就是先1*2=2,再2*3=6,再6*4=24的结果。;lambda没什么说的了。不是很全,后面会再总结。
from functools import reduce
import random
a = map(lambda x: x**2, range(1, 5))
print(list(a))
# [1, 4, 9, 16] b = filter(lambda x: x>0, [1,-5,6,0])
print(list(b))
# [1, 6] c = reduce(lambda x,y: x*y,range(1,5))
print(c)
# lst = [x * (-1)**x for x in range(1,10)]
random.shuffle(lst)
print(lst)
d = sorted(lst,key = lambda x: x**2,reverse = True)
print(d)
# [-3, -5, -7, 4, 6, 8, -1, 2, -9]
# [-9, 8, -7, 6, -5, 4, -3, 2, -1]
[学习总结] python语言学习总结 (二)的更多相关文章
- [学习总结] python语言学习总结 (三)
函数闭包 定义 延伸了作用域的函数(能访问定义体之外定义的非全局变量 作用 共享变量的时候避免使用了不安全的全局变量 允许将函数与某些数据关联起来,类似于简化版面向对象编程 相同代码每次生成的闭包,其 ...
- [学习总结] python语言学习总结 (一)
还是不多说话了.. 1.eval函数 用法:eval(expression, globals=None, locals=None) 解释:将字符串str当成有效的表达式来求值并返回计算结果. 就是可以 ...
- python语言学习
前段时间要做视频直播需要编写自动模块,就考虑使用python脚本语言,python的好多语法都是很独特的,比如数据类型不需要预定义,缩进的方式等,另外功能也很强大,豆瓣就是用python写的.我写的部 ...
- Python语言学习之Python入门到进阶
人们常说Python语言简单,编写简单程序时好像也确实如此.但实际上Python绝不简单,它也是一种很复杂的语言,其功能特征非常丰富,能支持多种编程风格,在几乎所有方面都能深度定制.要想用好Pytho ...
- python语言学习1——初识python
Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. 龟叔给Python的定位是“优雅”.“明确”.“简单”,所以Python ...
- Python语言学习之C++调用python
C++调用python 在C/C++中嵌入Python,可以使用Python提供的强大功能,通过嵌入Python可以替代动态链接库形式的接口,这样可以方便地根据需要修改脚本代码,而不用重新编译链接二进 ...
- Python语言程序设计之二--用turtle库画围棋棋盘和正、余弦函数图形
这篇笔记依然是在做<Python语言程序设计>第5章循环的习题.其中有两类问题需要记录下来. 第一是如何画围棋棋盘.围棋棋盘共有19纵19横.其中,位于(0,0)的星位叫天元,其余8个星位 ...
- 二十五、python中pickle序列学习(仅python语言中有)
1.pickle序列介绍:提供4个关键字:dumps,dump,loads,load 语法:f.write(pickle.dumps(dict))=pickle.dump(dict,f) " ...
- python语言学习笔记整理
什么是程序? 程序等于数据结构加算法,那么数据结构是一个静态的东西,算法是一个动态的东西,我们用一个新的语言编写这个程序,我们要考虑到语言也主要由数据结构和算法相关的东西,或静态或动态的东西来构成,所 ...
随机推荐
- python + requests实现的接口自动化框架详细教程
前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自 ...
- window.onerror 捕捉所有的前端error
//[捕捉所有前端error] window.onerror = function (errormessage, url, line, column, error) { console.log(&qu ...
- Linux运用一些常用命令
今天搜集整理了一些Linux服务器运维常用命令,希望对大家有帮助:1.删除0字节文件 find -type f -size 0 -exec rm -rf {} 2.查看进程按内存从大到小排列 ps - ...
- 微信小程序-工具无法加载本地模拟开发服务的解决办法
微信小程序开发工具出现如下问题: 因为网络代理软件或者 VPN 影响,工具无法加载本地模拟开发服务 请尝试以下任一解决方案1.关闭相关网络代理软件,重新编译成功后,再启动相关网络代理软件: 2.配置 ...
- iOS文字转语音(语音朗读)
1.第一步导入framework 2.导入头文件 #import <AVFoundation/AVSpeechSynthesis.h> 3. 设置代理 并写下面方法 (注:代理方法用不到 ...
- 手机APP开发(安卓、IOS)logo图标在线生成工具上线啦。
网址:http://www.bejson.com/ui/create_logo/ 您只需要上传一张2M以内的jpg或png图片.然后输入验证码点击提交后,会自动的处理并生成一个压缩包下载. 目前支持2 ...
- Serilog 是 ASP.NET Core 的一个插件,可以简化日志记录
[翻译] ASP.NET Core 利用 Docker.ElasticSearch.Kibana 来记录日志 原文: Logging with ElasticSearch, Kibana, ASP.N ...
- Token认证登录以及权限控制
IdentityServer4实现Token认证登录以及权限控制 相关知识点 不再对IdentityServer4做相关介绍,博客园上已经有人出了相关的系列文章,不了解的可以看一下: 蟋蟀大神的: ...
- css文本换行的问题
今天敲代码的时候发现了一个一直都没太注意的小问题,当我在一个200px的div中写了一长串的‘f ‘时发现没有换行 但加上空格或标点符号后就能自动换行 原来浏览器把它当成了一串完整的单词,所以默认不换 ...
- 把本地项目上传到github 不使用eclipse
https://blog.csdn.net/m0_37725003/article/details/80904824