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中函数的基本使用的更多相关文章

  1. 用python解析pdf中的文本与表格【pdfplumber的安装与使用】

    我们接触到的很多文档资料都是以pdf格式存在的,比如:论文,技术文档,标准文件,书籍等.pdf格式使得用机器从中提取信息格外困难. 为了解决这个问题,我找到了几种解决方案,最后选择了python上的p ...

  2. python解析excel中图片+提取图片

    解析表格是常用的技术.但是有些表各里面有图片怎么办?我想获得表格里面的图片,值得注意的是,图片没有位置信息,所以最好给图片进行编号,编号代表位置. 下面附上提取表格里面图片的代码.只要输出表格地址,和 ...

  3. Python解析CSV中的多维字典

    CSV文件结构如下,其中字段A为唯一 代码如下,Python27 with open(file_obj+'TEST.CSV','r') as f: #转为字典 Reader=csv.DictReade ...

  4. python解析网页中js动态添加的内容

    https://www.cnblogs.com/asmblog/archive/2013/05/07/3063809.html https://www.zhihu.com/question/21471 ...

  5. 从json到python解析python,从bson到monogdb

    1.JSON JSON是JavaScript Object Notation的缩写,中文译为JavaScript对象表示法.用来作为数据交换的文本格式,作用类似于XML,而2001年Douglas C ...

  6. python中函数的参数解析

    python中函数的各种参数梳理: 1.形参:函数定义时传入的参数 2.实参:函数调用时传入的参数 (有形参必传实参,形参里自身特点可不传的,可传可不传) 3.缺省参数:不传为默认值,传了会覆盖(下面 ...

  7. python 中函数的参数

    一.python中的函数参数形式 python中函数一般有四种表现形式: 1.def function(arg1, arg2, arg3...) 这种是python中最常见的一中函数参数定义形式,函数 ...

  8. python 中函数参数传递形式

    python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要 ...

  9. python中函数嵌套、函数作为变量以及闭包的原理

    嵌套函数: python允许创建嵌套函数.也就是说我们可以在函数里面定义函数,而且现有的作用域和变量生存周期依旧不变. 例子: #encoding=utf-8 def outer():    name ...

随机推荐

  1. Protobuf协议应用干货

    Protobuf应用广泛,尤其作为网络通讯协议最为普遍.本文将详细描述几个让人眼前一亮的protobuf协议设计,对准备应用或已经应用protobuf的开发者会有所启发,甚至可以直接拿过去用. 这里描 ...

  2. linux设备驱动程序--gpio控制

    gpio驱动程序 上一章节linux设备驱动程序--创建设备节点章节主要介绍了linux字符设备驱动程序的框架,从这一章节开始我们讲解各种外设的控制,包括gpio,i2c,dma等等,既然是外设,那就 ...

  3. ztree的添加、修改、删除及前后台交互

    一.引入资源下载并引入ztree的相关js,css和img等.http://www.treejs.cn/v3/api.php ztree的核心代码jquery.ztree.core.jsztree关于 ...

  4. position 的absolute会使display变成inline-block

    position:absolute和float会隐式地改变display类型,不论之前什么类型的元素(display:none除外), 只要设置了position:absolute. float中任意 ...

  5. WPF系列 —— 控件添加依赖属性

    依赖属性的概念,用途 ,如何新建与使用.本文用做一个自定义TimePicker控件来演示WPF的依赖属性的简单应用. 先上TimePicker的一个效果图. 概念 和 用途:依赖属性是对传统.net ...

  6. Flash完美跨域访问的方法

    先,你要确定以下几点,否则可能无法实现: 1.你要跨到哪个域,你必须能管理那域上文件,因为这里要放一个通行文件. 2.你的Flash如果只有SWF,那不一定能实现,因为有时,Flash的AS中,要加入 ...

  7. Mockito 学习资料

    Mockito 学习资料 网址 单元测试指南:Mockito https://blinkfox.github.io/2018/11/15/hou-duan/java/dan-yuan-ce-shi-z ...

  8. linux MySQL5.7 rpm安装(转)

    删除旧包: # rpm -qa | grep -i mysql # rpm -ev mysql-libs-* --nodeps 安装rpm包: # rpm -ivh mysql-community-c ...

  9. ksh与bash的异同

    (1) 在ksh是,数组的index只能从0到1023,而bash中没有这样的限制. (2) ksh与bash初始化数组的语法不同: 如下所示 icymoon# ksh icymoon# set -A ...

  10. spring注解式参数校验列表

    校验注释列表: @AssertFalse Boolean,boolean 验证注解的元素值是false @AssertTrue Boolean,boolean 验证注解的元素值是true @NotNu ...