Python函数基础

函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件

函数用于将相关功能打包并参数化

在Python中可以创建4种函数

全局函数:定义在模块中 //仅限单个文件

局部函数:嵌套于其它函数中

lambda函数:表达式

方法:与特定数据类型关联的函数,并且只能与数据类型关联一起使用

Python提供了很多内置函数

语法

def functionName(parameters)

suite

一些相关的概念

def是一个可执行语句

因此可以出现在任何能够使用语句的地方,甚至可以嵌套于其它语句,例如if或while中

def创建了一个对象并赋值给一个变量名(即函数名)

return用于返回结果对象,其为可选;无return语句的函数自动返回None对象

返回多个值时,彼此间使用逗号分隔,且组合为元组形式返回一个对象

def语句运行之后,可以在程序中通过函数后附加括号进行调用

Python函数作用域

Python创建、改变或查找变量名都是在名称空间中进行过

在代码中变量被赋值的位置决定了其能被访问到方位

函数定义了本地作用域,而模块定义了全局作用域

1.每个模块都是一个全局作用域,因此,全局作用域的范围仅限于单个程序文件

2.每次对函数的调用都会创建一个新的本地作用域,赋值的变量除非声明(global)为全局变量,否者均为本地变量。

3.所有的变量名都可以归纳为本地、全局或内置的(由_bultin_模块提供)

变量名解析:LEGB原则

变量名引用分三个作用域进行:首先是本地、之后是函数内、接着是全局、最后是内置

local(funtion)\Enclosin function locals\Global(module)\Builtt-in(Python)

Python的闭包:

定义在外层函数内,却又在内层函数引用的变量,在外层函数返回时,如果说外层函数直接返回了内层函数作为返回结果,再次调用外层函数,可以直接仍然使用外层函数的变量。

函数的参数

def functionName()

l1 = [1,2,3]

def f4(x):

x.pop()

print x

f4.(l1)

f4.(l1[:]) //区别

参数传递形式

1位置参数:从左到右

2关键字参数:按关键名称匹配

混用上面两种方式时:所有位置参数在前,所有关键字参数

3默认参数:定义函数时使用"name=value"的语法直接给变量一个值,从而传入的值可以少于参数个数

混用默认和无默认值的参数时,无默认值放前面

4可变参数:定义函数使用*开头的参数,可用于收集任意多基于位置或关键字的参数。

def f1(*x) def f1(**x) 一个传参数,一个传字典 因此参数中不能有name=value

5可变参数解包:调用函数时,使用*开头的参数,可用于将参数集合打散,

匿名参数lambda

lambda运算符

lambda args:expression f20 = lambda x,y: x + y

args: 以逗号分割的参数列表

expression:用到args中各参数的表达式

lambda语句定的代码必须是合法的表达式,不能出现多条件语句(可使用if的三元表达式)和其他非表达十语句,如for和while等

lambda的首要用途是指短小的回调函数

lambda将返回一个函数而不是将函数赋值给某个变量名

注意1.lambda是一个表达式而非语句

2.lambda是一个单个表达式,而不是一个代码块。

def 语句创建的函数将赋值给某变量名,而lambda表达式则直接返回函数

def testFunc(x,y,z):return x+y+z testFunc(4,5,6)

lambda也支持使用默认函数

f20 = lambda x,y,z: x + y + zf(4,5,6)

f20 = (lambda x,y,z=10: x + y + z) f(4,5)

l3 = [(lambda x: x*2),(lambda y: y*2)]

for i in l3:

print i(4)

Python函数式编程

也称为泛函编程,是一种编程范型

它将电脑运算是为教学上的函数计算,并且避免状态以及可变数据

函数式编程语言的基础是lambda演算,而且lambda演算的函数可以接收函数作为当作输入和输出

Python支持有限的函数式编程功能

1.过滤器

filter() 为已知的序列的每个元素调用给定的布尔函数

调用中,返回值为非零值的元素将被添加至一个列表中

def f1():

2.映射器

map()将

yield 和生成器

def genNum(n):

while i > n:

yield i ** 2

i+=1

g1 = genNum(20)

for i in g1:

装饰器:

1.装饰器本身是一个函数,用于装饰其它函数

2.功能:增强被装饰函数的功能

装饰器一般接收一个函数对象作为参数,对其进行增强

def deco(func):

def wrapper():

print "plz say someting:"

func()

return wrapperprint "Nozuo dodai"

@deco

def show():

return "i am from Mars"

递归:

递归需要边界条件,递归前进段和递归返回段:

def fact(n):

if n

else:return n*fact(n-1)

fact(3)

协程:

函数的设计规范

耦合性

1.通过参数输入,以及通过return产生输出以保证函数的独立性

2.尽量减少使用全局变量今昔你个函数间通信:

3.不要在函数中修改可变类型的参数:

4.避免直接改变定义在另外一个模块中的变量

聚合性

1.单个函数都应该有一个单一的,统一的目标

2.每个函数的功能都应该相对简单

———————————————————————————————————————————————————————————

做有思想的新青年

本文来自企鹅号 - 全球大搜罗媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CDA数据分析师

教你一招 | Python3新特性(一) :字符串

从python2转到python3的第一个问题就是字符串的问题,我花了些时间把我能想到的和字符串处理有关的东西都整理如下。 1、Python2的字符串编码 在p...

208100
来自专栏应兆康的专栏

12步轻松搞定Python装饰器

Python里面的装饰器比较复杂,下面12步可以帮你你较好的理解Python中的装饰器 1. 函数 在python中,函数通过 def关键字、函数名和可选的参数...

354100
来自专栏工科狗和生物喵

【计算机本科补全计划】Java学习笔记(四) 修饰符

正文之前 今天总算是把那个党员谈话给弄完了,三个学弟轮番跟我来聊天,讲自己的入党动机啥的,看到他们就仿佛看到了大一的自己,原来当时面对学长,面对这类事情,会紧张...

34490
来自专栏我是攻城师

Java基础类String了解一下

当你路过一些商场或者地铁口的时候,有没有被千篇一律的"xx健身,了解一下" 所烦到。

23750
来自专栏我的技术专栏

漫谈C++:良好的编程习惯与编程要点

13970
来自专栏Java帮帮-微信公众号-技术文章全总结

JAVA面试题解惑——final、finally和finalize的区别

final、finally和finalize的区别是什么? 这是一道再经典不过的面试题了,我们在各个公司的面试题中几乎都能看到它的身影。final、final...

35960
来自专栏C/C++基础

C++的数据类型

C++是一种强类型语言。C++程序中的任何变量(或函数)必须遵循“先说明后使用”的原则。定义数据类型有两个方面的作用:一是决定该类型的数据在内存中如何存储,二是...

9620
来自专栏源哥的专栏

BASE64编码

附录:BASE64编码的原理(节选自http://www.vbzx.net/ArticleView/vbzx_Article_View_1199.asp)

10540
来自专栏Java爬坑系列

【JAVA零基础入门系列】Day7 Java输入与输出

  本篇主要介绍Java的输入与输出,当然,这里说的是控制台下的输入与输出,窗口程序的设计将会再后续篇章中有详细说明。     Java的输出很简单,调用Sys...

24090
来自专栏信数据得永生

JavaScript 编程精解 中文第三版 六、对象的秘密

30560

扫码关注云+社区

领取腾讯云代金券