python函数理解_python理解-函数

简介

函数是python为了代码最大程度的重用和最小化代码冗余而提供的最基本的程序结构。

函数基本原则:

1、def是可执行的代码,可任意嵌套在语句中,实时执行的;

2、def创建了一个对象并将其赋值给某一变量名;

3、return将一个结果对象发送给调用者;

4、函数是通过赋值(对象引用)传递的;

5、global声明了一个模块级的变量并被赋值;

6、参数、返回值以及变量并不是声明;

python中的多态

多态:一个操作的意义取决于被操作对象的类型;

在python中,函数代码不应该关心特定的数据类型,更不能把函数限定在特定的类型上,应使其适用于所有类型。

作用域

LEGB法则:Local, Embedded, Global, Built-In

1.当在函数内使用未认证的变量名时,python搜索4个作用域:本地作用域,上层结构中def或lamda的本地作用域,之后是全局作用域,最后是内置作用域。并且在第一处能找到这个变量名的地方停下来。如果没有找到,python会报错。

2.当在函数中给一个变量名赋值时,(而不是在一个表达式中对其进行引用),python总是创建或者改变本地作用域的变量名,除非它已经在那个函数中声明为全局变量。

3.当在函数之外给一个变量名赋值时,本地作用域与全局作用域是相同的。

Global语句

Global语句是python中唯一看起来有些像声明语句的语句,但它只是一个命名空间的声明,而不是类型或大小的声明。

1.全局变量是位于模块文件内部的顶层的变量名;

2.全局变量如果是在函数内被赋值的话,必须经过声明;

3.全局变量名在函数的内部不经过声明也可以被引用;

注:全局变量名的赋值和引用在函数内是有区别的,单纯的引用并不需要声明,但赋值需要。

静态嵌套作用域

状态记忆:能够记住嵌套作用域的变量值的函数,尽管那个作用域或许已经不存在了。类是最直接也是最适合做状态记忆的,工厂函数也提供了一种替代的解决方案。

在较早的版本中,使用默认参数来保留嵌套作用域的状态。

lamda:本质上只是一个表达式,但将会生成后面会被调用的一个新的函数,与def很相似。

lamda能够工作,就是依赖嵌套作用域查找层,才能够看到所有生存在所编写的函数的变量。

在循环变量中使用嵌套作用域查找:所有在这个循环中产生的函数将会有相同的值-----在最后一次循环中完成时被引用变量的值。

所以说,嵌套作用域本质是是静态的,在静态编译时获得上层作用域中变量的值。

参数传递

关键点:

1.参数的传递时通过自动将对象赋值给本地变量来实现的;

2.改变函数的可变对象参数的值也许会对调用者有影响;

3.不可变参数是“通过值”进行传递;

4.可变对象是通过“指针”进行传递;

注:其实本质上所有参数传递都是应用传递,但因为不可变对象都不可能在原处改变不可变对象,所以在效果上类似于值传递。但可变对象时可以在原处修改的,所以,类似于指针。

特定的参数匹配模式

语法

位置

解释

func(value)

调用者

常规参数:位置匹配

func(name=value)

调用者

关键字参数:通过变量名进行匹配

func(*name)

调用者

以name传递所有的对象,并作为独立的基于位置的参数

func(**name)

调用者

以name成对的传递所有的关键字/值,并作为独立的关键字参数

def func(name)

函数

常规参数:通过位置或变量名匹配

def func(name=value)

函数

默认参数值,如果没有在调用中传递的话

def func(*name)

函数

匹配并收集(在元组中)所有包含位置的参数

def func(**name)

函数

匹配并收集(在字典中)所有包含位置的参数

区分:

关键字参数和默认参数;

分解参数和收集参数;

匿名函数lamda

lamda:生成函数对象的表达式形式

1.lamda是一个表达式,而不是一个语句;

2.lamda的主体是一个单个的表达式,而不是一个代码块;

将函数作为参数来使用

apply(func, tuple,dictionary)

但函数的参数列表无法预测时,使用apply来组合成一个元组。

map

在序列中映射函数

filter

基于某一测试函数过滤

reduce

对每对元素都应用函数并累计到结果中

列表解析表达式:映射

列表解析的语法是从集合理论表示法中的一种结构中衍生出来的,也就是对集合中的每一种元素应用某一种运算。

列表解析写在方括号中,是创建列表的新方式。

迭代器

生成器:包含了yield语句的函数将会特地编译为生成器;当调用时,他们将返回一个生成器对象,这个生成器对象支持迭代器对象接口。

迭代器:依次定义了next方法返回迭代中的下一个元素,抛出异常来终止这个迭代。迭代器是通过内置的iter函数获取的。

多种迭代方法

for循环使用range迭代;

列表解析表达式迭代;

map映射迭代;

list中的生成器表达式;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值