Day07-函数(2)

1.函数类型

函数也是一种类型,我们自定义的函数就是函数对象,函数名保存了函数对象的引用(地址)

def test():print('我是测试函数')
​
print(test)  #函数名是变量,指向了函数对象
pf = test    #pf变量也指向了函数对象,所以也可以通过pf调用test函数
pf()

2. 匿名函数

不再使用def 函数名()这种形式定义函数,而是使用lambda来创建匿名函数

特点:

  • lambda只是一个表达式,函数体比def定义的函数简单的多

  • lambda的函数体不再是代码块,而是一个表达式

  • lambda只有一行,运行效率很高

语法:

lambda [arg1,arg2....argn]:表达式(只能是一个表达式)
add = lambda a,b:a + b
print(add(3,5))

3.传入函数(理解)

一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数,也可以称之为传入函数。可以实现通用编程,排序等复杂功能

#传入函数,高阶函数
#能被2整除数的和
def sum_even(n):sum = 0for i in range(1,n+1):if i % 2 == 0:sum += ireturn sum
​
#能被7整除的数的和
def sum_seven(n):sum = 0for i in range(1,n+1):if i % 7 == 0:sum += ireturn sum
#能被3和5整除,但不能7整除的数的和
def sum_fifteen(n):sum = 0for i in range(1,n+1):if i % 15 == 0 and i % 7 != 0:sum += ireturn sum
#通用求和函数
def sum1(n,callback):'''功能:求满足callback规定条件的数的和:param n: 大于0的整数:param callback: 用于判断一个数是否满足指定条件,由调用者传入,有一个参数,形如:def callback(n):return: 求和的结果'''sum = 0for i in range(1,n+1):if callback(i):sum += ireturn sum
print(sum1(100,lambda x:x%2==0))
print(sum1(100,lambda x:x%7==0))
print(sum1(100,lambda x:x%15==0 and x % 7 != 0))

4.闭包

我们可以在一个函数中再定义一个函数,在函数内部定义的函数称之为内部函数,内部函数只能在函数内使用,不会污染外部空间。定义内部函数的函数称之为外部函数,这样的定义构成函数的嵌套

def outter(a): #外部函数x = 10def inner(y):  #内部函数print(x + y)inner(a)outter(20)
  • 内部函数只能在外部函数里调用,外界无法直接调用内部函数

在一个外部函数中定义了一个内部函数,内部函数里引用了外部函数的变量,并且外部函数的返回值是内函数的引用。这样内部函数和其执行所需的环境变量就构成了一个闭包

一般情况下,如果一个函数结束,函数的内部所有东西都会释放掉,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的局部变量将来会在内部函数中用到,就把这个局部变量绑定给了内部函数,然后自己再结束。

def outter(a): #外部函数x = adef inner(y):  #内部函数return x + y  #引用外部变量return inner  #返回内部函数(闭包)
pf = outter(20)
print(pf(10))  #30
print(pf(20))  #40

在闭包中无法直接修改外部变量x的值

def outter(a): #外部函数x = adef inner(y):  #内部函数# x += 10   #UnboundLocalError: local variable 'x' referenced before assignmentreturn x + yreturn inner

在python3中可以通过nonlocal关键字声明一下x,表示这个变量不是局部变量,需要向上一层变量空间找这个变量。

def outter(a): #外部函数x = adef inner(y):  #内部函数nonlocal xx += 10return x + yreturn inner

5.偏函数

当一个函数有大量参数,调用的时候非常不方便,可以使用偏函数技术,将一些参数固定(给默认值),达到简化函数调用的目的。

import functools
def test(a,b,c,d):print(a, b, c, d)
#从前面固定参数,使用位置参数就行,1=>a,2=>b
test1 = functools.partial(test,1,2)
test1(3,4)  #3=>c  4=>d
​
#从后面固定参数,需要使用关键字参数
test2 = functools.partial(test,c=3,d=4)
test2(1,2)  #1=>a 2=>b
​
#如果固定的参数不连续,则需使用关键字参数固定
test3 = functools.partial(test,b=2,d=4)
test3(a=1,c=3) #需要使用关键字参数,否则会报错

6.变量的作用域

程序中的变量并不是在任意的位置都可以随意访问,在哪里可以访问取决于这个变量的作用域,变量的作用域指的是变量在那段代码中可以使用,可以使用变量的那段代码就是变量的作用域。在python中,只有函数/类/模块才引入作用域,if/elif/else , while/for,try/except等并不会引入新的作用域

#if语句不引入新作用域,msg在外面可以使用
if True:msg = "message"
​
print(msg)

6.1 变量作用域的分类

按照作用域划分,可以分为:

  • L:Local,局部作用域

  • E:Enclosing,闭包作用域【闭包的外部函数中定义的变量】

  • G:Global,全局作用域 在所有函数外定义的变量

  • B:Built-in,內建作用域【内置作用域】

#1 局部作用域  
#局部变量只能在函数内部使用,外部无法引用
#局部变量的作用域从定义开始到函数体结束
def demo():num = 20  #局部变量  print(num)
demo()
#print(num) 错误
​
#闭包作用域
def outter():x = 10   #函数作用域,从定义开始到本函数结束def inner():y = x  #在闭包中可以引用print(y)return inner
pf = outter()
pf()  #执行闭包
print(pf.__closure__)
​
#全局作用域
x = 100    #全局作用域  从定义开始到本文件结束
def demo():print(x)
print(x)
​
#内建作用域,是指系统内建的函数或常量,在系统载入时加载,在所有模块中都可以直接引用
#比如说系统函数
print(max(1,2,3))  #max函数就是内建作用域  哪里都可以引用
def  demo():x = 30y = 50print(max(x, y))

6.2 变量作用域查找规则

以 L --> E --> G -->B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,最后到内建作用域中找。

6.3 全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,被称为局部变量

定义在函数外面的变量拥有一个全局作用域,被称为全局变量

局部变量和全局变量同名,局部优先

total = 0   #全局变量
def sum(arg1,arg2):total = arg1 + arg2   #局部变量print("函数内部:",total)return totalsum(10,20)
#print(total1)
print("函数外部:",total)
​
num = 1
def fun1():print(num) #UnboundLocalError: local variable 'num' referenced before assignmentnum = 123print(num)
​
fun1()

6.4 global和nonlocal

#1.在Python中,当内部作用域想修改全局变量的时候,则就要使用global关键字进行声明
num = 1
def fun1():global num   #告诉编译器,此处的num是全局变量print(num)   #1num = 123print(num)  #123fun1()
​
a = 10
def test():global  aa = a + 1print(a)
test()
​
#2.如果要修改函数作用域中的变量,则使用nonlocal
#需要明确的是,nonlocal关键字定义在闭包里面
x = 0  #全局作用域
​
def outer():x = 1   #闭包作用域
​def inner():nonlocal xx = 2   #局部作用域print("inner:",x)  #2
​inner()print("outer:",x)  #1---->2
​
outer()
print("全局:",x)  #0
​
#nonlocal关键字:声明了该变量不只是在outer函数中有效,在inner函数内部也有效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php在html里面的位置,关于script在html中的摆放位置解析

以前一直觉得script在html中的任何位置都可以,今天做一个需求的时候才更正了自己的错误思想啊--script的位置也不是随便放的。本文主要谈论关于script在html中的摆放位置。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。希望能帮助到…

Protocol Buffer技术详解(C++实例)

原文:http://www.cnblogs.com/stephen-liu74/archive/2013/01/04/2842533.html 这篇Blog仍然是以Google的官方文档为主线,代码实例则完全取自于我们正在开发的一个Demo项目,通过前一段时间的尝试,感觉这种结合的方式比较有利于培训…

yaml 解决问题

yaml 是什么? 在 github 一些开源项目里经常可以看到 .travis.yml 文件,后来接触持续集成这个概念时发现很多文件都是 .yml 后缀的文件。我在 阮一峰-YAML 语言教程 里了解了它的作用以及基本写法,他的那篇文章描述的略微有点啰嗦&#xff0…

2016 7 25 链表

1 #include<stdio.h>2 #include<stdlib.h>3 /* 4 usingnamespacestd;5 6 structNode7 {8 int data;//数据域9 struct Node*next;//指针域10 };11 12 /*13 Create14 *函数功能&#xff1a;创建链表.15 *输入&#xff1a;各节点的data16 *返回值&#xff1a;指…

php数值操作,php数值计算num类简单操作示例

php数值计算num类简单操作示例,在线,计算器,小数,整数,程序设计php数值计算num类简单操作示例易采站长站&#xff0c;站长之家为您整理了php数值计算num类简单操作示例的相关内容。本文实例讲述了php数值计算num类简单操作。分享给大家供大家参考&#xff0c;具体如下&#xff…

YAML-学习笔记!

YAML学习笔记 一、YAML简介 YAML&#xff0c;即YAML Ain’t Markup Language的缩写&#xff0c;YAML 是一种简洁的非标记语言。YAML以数据为中心&#xff0c;使用空白&#xff0c;缩进&#xff0c;分行组织数据&#xff0c;从而使得表示更加简洁易读。 二、YAML语法 1、基本规…

CentOS远程监控

近日&#xff0c;因工作需要&#xff0c;学习了CentOS远程监控的水平有限&#xff0c;多指教。 远程访问CentOS&#xff0c;包括三种方式ssh&#xff0c;telnet&#xff0c;vnc。 本例涉及的是以vnc远程访问CentOS。指令在root下操作。注意&#xff1a;vnc的端口为5900&#xf…

aix oracle 10.2.0.1 升级 10.2.0.4,AIX Oracle RAC 升级到10.2.0.4.0要特别注意的问题 - 爱肯的专栏 ......

AIX Oracle RAC 升级到10.2.0.4.0过程有如下报错(直接升级到10.2.0.4不需要应用Patch:6160398)&#xff1a;rootbwgl_db2:/u01/app/oracle/crs_1/bin# /u01/app/oracle/crs_1/install/root102.shError : Please change the CRS_ORACLE_USER id to have the following OS capabi…

将文件提交到github的两种方法

方法一 简要步骤如下&#xff1a; 登陆github&#xff0c;创建git仓库。记此git仓库的地址为[github_repository_url]&#xff0c;例如git仓库的地址&#xff1a;https://github.com/galian123/nodejs_http_server 在本地的工程目录执行git init&#xff0c;此工程目录是要提…

Visual Studio 2017新版发布,极大提高开发效率丨附下载

最新的Visual Studio 2017免费下载&#xff1a;https://www.evget.com/product...【包含Professional、Enterprise、Community版本】 为任何开发、应用和平台提供无与伦比的效率&#xff0c;Visual Studio 2017 候选发布。 提高了效率 代码导航、IntelliSense、重构、代码修复和…

BGP路由协议详解(完整篇)

原文链接&#xff1a;http://xuanbo.blog.51cto.com/499334/465596/ 2010-12-27 12:02:45 上个月我写一篇关于BGP协议的博文&#xff0c;曾许诺过要完善这个文档&#xff0c;但因最近的工作和授课很忙&#xff0c;所以没有时间进行完善。为了实现这个承诺&#xff0c;我在去外…

oracle 备份导出,oracle 怎么备份或导入导出表

exp/imp下面介绍的是导入导出的实例&#xff0c;向导入导出看实例基本上就可以完成&#xff0c;因为导入导出很简单。数据导出&#xff1a;1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中exp system/managerTEST filed:\daochu.dmp fully2 将数据库中…

GitHub+Hexo搭建自己的Blog之-本地环境部署01

前言 之前我的博客没有绑自己的域名&#xff0c;一直在github上放着&#xff0c;访问起来比较麻烦&#xff0c;前阵子在阿里云买了这个域名&#xff0c;配置上之后&#xff0c;就可以通过自己的域名访问了&#xff0c;有些朋友问我这个博客怎么搭的&#xff0c;用的什么主题&am…

appsettings 连接oracle数据库,ABP .net core集成访问Oracle数据库

1.添加包引用&#xff1a;Microsoft.EntityFrameworkCore.RelationalOracle.EntityFrameworkCore2.重写DbContext OnModelCreating/// /// 判断如果是Oracle&#xff0c;需要执行Schema/// /// protected override void OnModelCreating(ModelBuilder modelBuilder){//判断当前…

Day08-函数(3)

import functools #偏函数 def demo(a,b,c,d):print(a,b,c,d)# def partital_demo(a,b): # demo(a,b,3,4) # partital_demo(1,2)#实现偏函数 # #固定前两个 # demo functools.partial(demo,5,6) # demo(10,50)# #固定后两个 # demofunctools.partial(demo,c3,d5) # demo(1…

使用VS2010编译Qt 5.6.1过程记录

由于Qt官方发布的Qt 5.6.1二进制安装包没有对应VS2010版本的&#xff0c;而我的电脑上只安装了VS2010&#xff0c;因此只能自己编译。 本文记录本人的编译安装过程&#xff0c;以及其中遇到的一些问题。 本文使用VS2010 32位编译Qt 5.6.1。 1. 下载Qt源代码 Qt源代码下载地址&…

golang 指针

指针1、简单的定义一个指针package mainimport "fmt"func main(){var p *inti :2p &ifmt.Println("memory address i:",p) } //执行结果&#xff1a; memory address i: 0xc42000a2e02、打印指针的值package mainimport "fmt"func main(){v…

php防错处理,更好的PHP错误处理

错误类型PHP 主要有两种错误&#xff1a;触发错误和异常。其中触发错误大概可以分为&#xff1a;编译错误、引擎错误和运行时错误&#xff0c;其中前两个是无法捕获的&#xff1b;异常都是可以捕获的&#xff0c;当没有尝试捕获时则会中断代码。触发错误可以通过 error_get_las…

Windows安装Apache注册服务出现(OS 5)拒绝访问。 : AH00369: Failed to open the Windows service manager,

windows安装Apache&#xff0c;注册服务出现“(OS 5)拒绝访问。 : AH00369: Failed to open the WinNT service manager..."错误 在安装Apache的时候&#xff0c;我下载的是zip格式&#xff0c;不是msi安装版&#xff0c;需要自己注册服务&#xff0c;才能在桌面任务栏里有…

算法与数据结构(三) 二叉树的遍历及其线索化(Swift版)

前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作&#xff0c;并且还聊了栈与队列的相关内容。本篇博客我们就继续聊数据结构的相关东西&#xff0c;并且所涉及的相关Demo依然使用面向对象语言Swift来表示。本篇博客我们就来介绍树结构的一种&#xff1a;二叉树。在…