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. tensorflow提示:No module named ''tensorflow.python.eager".

        版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_27921205/articl ...

  2. Kombu源码分析(一)概述

    Celery是Python中最流行的异步消息队列框架,支持RabbitMQ.Redis.ZoopKeeper等作为Broker,而对这些消息队列的抽象,都是通过Kombu实现的.Kombu实现了对AM ...

  3. mysql显示一张表的索引

    show index from tm_show.fulfillment_order;show index from tm_show.express_verify;show index from tra ...

  4. Java基础--线程创建方式

    线程的创建主要有两种形式,通过继承Thread或者实现Runnable接口,本质上没有太大区别. /** * @date: 2019/7/16 **/ public class ThreadOne i ...

  5. 2019年杭电多校第三场 1011题Squrirrel(HDU6613+树DP)

    题目链接 传送门 题意 给你一棵无根树,要你寻找一个根节点使得在将一条边权变为\(0\)后,离树根最远的点到根节点的距离最小. 思路 本题和求树的直径很像,不过要记得的东西有点多,且状态也很多. \( ...

  6. beta冲刺总结那周余嘉熊掌将得队

    作业格式 课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺 团队名称: 那周余嘉熊掌将得队 作业目标:beta冲刺总结 队员学号 队员姓名 博客地址 备注 221600131 J ...

  7. 基于变分自编码器(VAE)利用重建概率的异常检测

    本文为博主翻译自:Jinwon的Variational Autoencoder based Anomaly Detection using Reconstruction Probability,如侵立 ...

  8. Arthas - 开源的java诊断工具,非常有用

    常用命令 help 查看帮助 help COMMAND 查看指定命令的详细帮助 COMMAND -h 查看指定命令的详细帮助 double tab 查看支持的所有命令 dashboard 查看线程JV ...

  9. 关于Classloader(学习笔记)

    1)类加载的过程是怎么样的?①加载:根据具体需求,选择合适的加载器(Bootstrap ClassLoader不可直接获取.Extension ClassLoader.系统.自定义)来控制字节流的获取 ...

  10. flux沉思录:面向store和通信机制的前端框架

    一.综述 Flux 被用来描述“单向”的数据流,且包含某些特殊的事件和监听器. 响应式编程是一种面向数据流和变化传播的编程范式 flux是响应式编程的一种? Flux 在本质上采用了模型-视图-控制器 ...