【Python】解析Python中函数的基本使用
1.简介
在Python中定义函数的基本格式为:
def <函数名>(参数列表):
<函数语句>
return <返回值>
Python中的函数形式比较灵活,声明一个函数不需要声明返回值类型,也不需要声明参数类型。在使用函数之前必需先定义函数。
下面是一个基本使用案例:
'''
多行注释:定义sum函数,求和。
'''
def sum(t):
result = 0;
for e in t:
result+=e;
return result;
#单行注释:将set对象传入sum函数
res = sum({1,2,3,4});
print(res);
2.global全局变量
2.1 global关键字的使用
Python中变量作用域分为局部作用域、全局作用域和内置作用域。
def test():
print(a);
a = "hello world";
test();
输出:
hello world
当执行到print(a)的时候,会在test()函数中搜索变量a,如果test()作用域中没有变量a,那么它会去全局作用域中搜索变量a。
上面案例中变量a的作用域是全局作用域。若函数中也有一个局部作用域变量a,那么会发生什么呢?
def test():
a = "i am in internal";
print(a);
a = "i am in external";
test();
print(a);
输出:
i am in internal
i am in external
这个输出结果是我们预期之内的,从结果可以看出,当在局部作用域和全局作用域中有相同的变量名时,在局部作用域之内以局部作用域的变量名为准,在局部作用域之外以全局作用域的变量名为准。
如果想在局部作用域之内使用全局作用域的变量,那么可以使用global关键字:
def test():
global a;
a = "hello world";
print(a);
a = "i am in external";
test();
print(a);
输出:
hello world
hello world
2.2 globals()和locals()的使用
在Python中可以使用locals()来访问局部命名空间中变量,例如:
def functest(i,str):
x = 12345
print(locals())
functest(1,"test")
输出:
{'x':12345,'str':'test','i':1}
内置函数globals()用来访问全局命名空间中变量,例如:
if '__main__' == __name__:
print(globals())
输出:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/test1.py', 'x': 12345}
Python中的globals()函数和locals()函数的返回值数据类型都是Dictionary,但是locals()返回的是局部命名变量的副本;而globals()返回的是实际的全局命名空间,所以任何对globals()的改变都会影响到全局变量。
def funtest(i):
print('局部变量 i = ',locals()['i'])
print("修改局部变量 locals()['i']=12 ")
locals()['i'] = 12
print('局部变量 i = ',locals()['i'])
y = 1
if '__main__' == __name__:
funtest(y)
print('----------------')
print('全局变量 y = ',globals()['y'])
print("修改全局变量 globals()['y']=12")
globals()['y'] = 12
print('全局变量 y = ',globals()['y'])
输出:
局部变量 i = 1
修改局部变量 locals()['i']=12
局部变量 i = 1
----------------
全局变量 y = 1
修改全局变量 globals()['y']=12
全局变量 y = 12
从上面的结果可以看出,globals()和locals()虽然都返回Dictionary的数据类型,但是任何对globals()的修改都会影响到全局变量,但是对locals()的修改不会影响到任何局部变量。
3.不定长参数
不定长参数也被称为可变参数,在定义变长参数的时候只需要在变量前面加上星号“*”。变长参数的形参类型是元组类型(tuple),若不传入任何参数那么它就是一个空元组。
def printinfo(num,*vartuple):
print("接下来会打印 ",num," 个参数");
for a in vartuple:
print(a); printinfo(3,"how","are","you");
输出:
接下来会打印3个参数
how
are
you
Python中除了单个星号的可变参数,还有两个星号的可变参数(**),两个星号的可变参数表示关键字参数,它本质上是一个dict,下面的代码展示了如何使用。
def fun(**kwargs):
for key, value in kwargs.items():
print("{0} 喜欢 {1}".format(key, value)) fun(Geek="cat", cat="box")
输出:
Geek 喜欢 cat
cat 喜欢 box
4.匿名函数
在Python中,lambda的语法是唯一的。其形式如下:
lambda argument_list: expression
其中,lambda是Python预留的关键字,argument_list和expression由用户自定义。具体介绍如下。
1.这里的argument_list是参数列表。它的结构与Python中函数(function)的参数列表是一样的,argument_list可以有非常多的形式。
2.这里的expression是一个关于参数的表达式。表达式中出现的参数需要在argument_list中有定义,并且表达式只能是单行的。
lambda函数示例:
lambda x, y: x*y;函数输入是x和y,输出是它们的积x*y
lambda:None;函数没有输入参数,输出是None
lambda *args: sum(args); 输入是任意个数的参数,输出是它们的和(隐性要求是输入参数必须能够进行加法运算)
lambda **kwargs: 1;输入是任意键值对参数,输出是1
例如:
f = lambda x, y: x*y #声明lambda表达式
res = f(2,3) #调用函数
将lambda函数作为参数传递给其他函数:
filter函数。此时lambda函数用于指定过滤列表元素的条件。例如filter(lambda x: x % 3 == 0, [1, 2, 3])指定将列表[1,2,3]中能够被3整除的元素过滤出来,其结果是[3]。
sorted函数。此时lambda函数用于指定对列表中所有元素进行排序的准则。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))将列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素与5距离从小到大进行排序,其结果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。
map函数。此时lambda函数用于指定对列表中每一个元素的共同操作。例如map(lambda x: x+1, [1, 2,3])将列表[1, 2, 3]中的元素分别加1,其结果[2, 3, 4]。
reduce函数。此时lambda函数用于指定列表中两两相邻元素的结合条件。例如reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])将列表 [1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素从左往右两两以逗号分隔的字符的形式依次结合起来,其结果是'1, 2, 3, 4, 5, 6, 7, 8, 9'。
【Python】解析Python中函数的基本使用的更多相关文章
- 用python解析pdf中的文本与表格【pdfplumber的安装与使用】
我们接触到的很多文档资料都是以pdf格式存在的,比如:论文,技术文档,标准文件,书籍等.pdf格式使得用机器从中提取信息格外困难. 为了解决这个问题,我找到了几种解决方案,最后选择了python上的p ...
- python解析excel中图片+提取图片
解析表格是常用的技术.但是有些表各里面有图片怎么办?我想获得表格里面的图片,值得注意的是,图片没有位置信息,所以最好给图片进行编号,编号代表位置. 下面附上提取表格里面图片的代码.只要输出表格地址,和 ...
- Python解析CSV中的多维字典
CSV文件结构如下,其中字段A为唯一 代码如下,Python27 with open(file_obj+'TEST.CSV','r') as f: #转为字典 Reader=csv.DictReade ...
- python解析网页中js动态添加的内容
https://www.cnblogs.com/asmblog/archive/2013/05/07/3063809.html https://www.zhihu.com/question/21471 ...
- 从json到python解析python,从bson到monogdb
1.JSON JSON是JavaScript Object Notation的缩写,中文译为JavaScript对象表示法.用来作为数据交换的文本格式,作用类似于XML,而2001年Douglas C ...
- python中函数的参数解析
python中函数的各种参数梳理: 1.形参:函数定义时传入的参数 2.实参:函数调用时传入的参数 (有形参必传实参,形参里自身特点可不传的,可传可不传) 3.缺省参数:不传为默认值,传了会覆盖(下面 ...
- python 中函数的参数
一.python中的函数参数形式 python中函数一般有四种表现形式: 1.def function(arg1, arg2, arg3...) 这种是python中最常见的一中函数参数定义形式,函数 ...
- python 中函数参数传递形式
python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要 ...
- python中函数嵌套、函数作为变量以及闭包的原理
嵌套函数: python允许创建嵌套函数.也就是说我们可以在函数里面定义函数,而且现有的作用域和变量生存周期依旧不变. 例子: #encoding=utf-8 def outer(): name ...
随机推荐
- BLAS快速入门
一.简介 BLAS[Basic Linear Algebra Subprograms,基础线性代数程序集]是一个应用程序接口[API]标准,用于规范发布基础基础线性代数操作的数值库[常用于向量或矩阵计 ...
- Java 堆内存 新生代 (转)
Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象.在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( You ...
- pandas 之 多层索引
In many applications, data may be spread across a number of files or datasets or be arranged in a fo ...
- 《linux就该这么学》课堂笔记03 命令初识 echo、date、reboot、poweroff、wget...
Linux进程的六种状态(R.S.D.T.Z.X): R --- TASK_RUNNING(可执行状态) S --- TASK_INTERRUPTIBLE(可中断的睡眠状态) D --- TASK_U ...
- linux命令实现在当前文件夹下面模糊搜索文件
在当前文件中查找包含的字符串 find . -name "*.txt" | xargs grep 'abc' ,例如:查找txt文件中包含字符串a的字符串
- expect免交互用法
一.ssh免交互远程连接linux服务器 ssh在远程连接linux系统时,会有交互,比如输入yes/no,或者需要输入密码.我们怎么避免这些交互呢!比如我们可以用telnet远程登录交换机,去备份交 ...
- 初步学习JAVA面向对象初步认识及面向对象内存分析图举例说明
1. 说到面向对象, 一个绕不开的话题,就是面向过程. 面向过程适合简单.不需要协作的事务. 面向过程 = 分解问题 + 逻辑为先 = 先细节,再整体. 对比面向过程, 面向对象是模块化的, 当我们思 ...
- 定制你的“魅力”报告--Allure
“人世间是一个大囚笼,每个人都在狱中,砥砺前行.九狱台中的刺,是生活中所要面对的砥砺,是锋利的刺,将自己肉身刺得千疮百孔,将自己的道心刺得千疮百孔.” ---<牧神记·九狱锁道心> 一.简 ...
- Java并发编程:ThreadPoolExecutor + Callable + Future(FutureTask) 探知线程的执行状况
如题 (总结要点) 使用ThreadPoolExecutor来创建线程,使用Callable + Future 来执行并探知线程执行情况: V get (long timeout, TimeUnit ...
- 【P1889】SOLDIERS (中位数)
题目描述 在一个划分成网格的操场上, n个士兵散乱地站在网格点上.由整数 坐标 (x,y) 表示.士兵们可以沿网格边上.下左右移动一步,但在同时刻任一网格点上只能有名士兵.按照军官的命令,们要整齐地列 ...