chapter4.2、函数返回值

函数返回值,作用域

  Python函数使用return语句返回“返回值”

  函数一定有返回值。没有return 语句,隐式调用return None

  一个函数可以存在多个return语句,但只执行一条,如果一条return都没有执行,就隐式调用return None

  如果有必要,可以调用return None,可以简写为return

  return直接返回函数,return之后的语句不再执行其他语句不再执行

  return 是函数结束标志,返回值只有一个,只返回一次,

  return的内容要包装在容器中,没有用元组包

嵌套函数

  函数可见范围,就是作用域

  内部函数不能在外部使用,不可见,会抛NameError

  标识符的可见范围,就是作用域,一般说常量的作用域

全局作用域  在整个程序运行环境中都可见

局部作用域  在函数,类内可见,局部变量使用范围不能超过其所在的局部变量

赋值即重新定义

本地变量作用域作用于整个函数,函数内上方调用时受下方的x的重新定义的影响,不会去上一层函数引用

global 全局变量,

  将当前作用域内的变量声明为使用外部的全局变量,全局变量中没有就新建变量,如果是引用没有就报错,

  只到全局寻找变量,不到enclosing,

  global放在局部作用域相当于全局作用域操作变量

  函数使用为了封装,尽量与外界隔离,如果需要使用全局变量,使用形参传参解决

函数中少使用全局变量

闭包:

自由变量:未在本地作用域中定义的变量,例如定义在内层函数外的外层函数的作用域中的变量。

闭包的概念:出现在嵌套函数中,指内层函数用到了外层函数的作用域中的自由变量,就形成了闭包

nonlocal 在外层定义,不能是全局作用域。

内层函数调用外层的自由变量,直接使用就形成闭包,重新定义就要使用nonlocal

使用了nonlocal关键字,将变量标记为不在本地作用域,而在上级某一级的局部作用域中定义,但不能是全局作用域中

默认值的作用域,

函数也是对象,Python中 把函数的默认值放在了属性中,这个属性就伴随着这个函数对象的整个生命周期

查看属性foo.__defaults__

如果默认值是引用类型,变动其中的内容,不会改变引用类型的地址。

属性保存在元组中保存位置参数的默认值,不会在函数体运行中改变。

属性__default__中保存元组中的所有位置参数默认值,

属性__kwdefault__中保存元组中的所有keyword-only参数默认值,

使用可变类型做默认值,就能修改这个默认值,根据情况决定使用与否

可以使用影子拷贝创建新对象,但不能改变传入的参数

使用None作为默认缺省值。通过值得判断,就可以灵活创建或者修改传入的对象,较为常用

变量名解析原则LEGB

  Local:本地作用域,局部作用域的 local 命名空间,函数调用时创建,调用结束消亡。

  Enclosing:python2.2 时引入了嵌套函数,实现了闭包,这个就是嵌套函数的外部函数的命名空间

  Global:全局作用域,即一个模块的命名空间,模块被import时创建,解释器退出时消亡

  Build-in:内置模块的命名空间,生命周期从python解释器启动时创建到解释器退出时消亡,如:print(open),printhe open都是内置的变量

函数销毁

  全局函数:

     同名函数覆盖

     del 函数名 删除函数标识符,而非函数对象,引用计数减一。

     程序结束时

  局部函数:

      重新在上级作用域定义同名函数

      del 语句删除函数名称,函数对象的引用计数减一

      上级作用域销毁时

原文地址:https://www.cnblogs.com/rprp789/p/9527184.html

时间: 2024-11-13 11:55:16

chapter4.2、函数返回值的相关文章

以函数返回值做参数时,函数调用的顺序

环境:vs2013 在下面的代码中 1 //类似于下面的代码 2 3 foo(char*,char*,char*); 4 5 char* str ="A#B#C"; 6 7 foo(strtok(str,"#"),strtok(NULL,"#"),strtok(NULL,"#")); 预计让函数foo得到("A","B","C")的参数,程序编译的时候没问题,但是运行

函数指针与指针函数返回值的区别

指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针定义: 类型标识符 *函数名(参数表)eg: int *f(x,y);函数指针是指向函数的指针变量,即本质是一个指针变量.int (*f) (int x); /* 声明一个函数指针 */ f=func; /* 将func函数的首地址赋给指针f */ 函数指针与指针函数返回值的区别,码迷,mamicode.com

对象做函数参数和函数返回值时,调用复制构造函数,构造函数,析构函数的情况

// 对象做函数参数和返回值.cpp : 定义控制台应用程序的入口点.//exit(0)表示正常退出程序,exit(0)表示异常退出 //在调用input时,编译器用对象A去创建了形参对象temp,调用了复制构造函数,对象A中的数据复制给了对象temp// 在input函数中,执行temp.set(s),为对象temp中数据成员str申请了动态储存空间,并设置了输入的字符串//并没有改变实参A中的数据成员str的储存空间,故在执行语句A.show()后输出的字符串并没有改变.在函数调用结束后 /

shell调用函数返回值深入分析

编写shell脚本过程中,我们经常会自定义一些函数,并根据函数的返回值不同来执行相应的流程,那么我们如何来获取函数的返回值呢? 首先shell中调用函数有两种方式: 第一种:value=`function_name [arg1 arg2 ......]` 或 第二种:function_name [arg1 arg2 ......] echo $? 这两种有什么区别呢? 举个例子来说: [[email protected] ~]# cat test.sh #!/bin/sh function aa

const修饰函数参数 const修饰函数返回值 const修饰成员函数

看到const 关键字,C++程序员首先想到的可能是const 常量.这可不是良好的条件反射.如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮.const 更大的魅力是它可以修饰函数的参数.返回值,甚至函数的定义体. const 是constant 的缩写,"恒定不变"的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:"Use const whenever you need". 1

string 中的 length函数 和size函数 返回值问题

string 中的 length函数 和 size函数 的返回值  (  还有 char [ ] 中 测量字符串的  strlen 函数 ) 应该是 unsigned int 类型的 不可以 和 -1 比较. 应尽量避免 unsigned int 类型 和 int类型 数据 的比较 .当unsigned int 类型 和 int类型 数据 比较 时 ,会 把int 类型 转换 为 unsigned int类型 .如果 int是负数 ,转换 为 unsigned int 会是 一个 很大 的正整数

C语言的函数返回值

一:背景 谈到C语言的函数返回值,可能会感觉很亲切,不就是一个函数返回值嘛,当初学C语言的时候早就学过了很easy嘛,我曾经也是这么想的.后来要上研究生了,研究生阶段搞得就是C,所以又重新开始学习C,学习C的过程中遇到了很多问题,在此博客中一一记录.实际过程中遇到的第一个问题自然就是函数返回值了.如果有人问你在一个函数中声明一个字符串数组,最后再return这个数组.这可以实现嘛?如果是问我我可能会毫不犹豫的说OK.那事实呢?由此本文诞生了...... 二:问题 先看几个实际的例子: #incl

将引用作为函数返回值的优缺点

格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 }好处:在内存中不产生被返回值的副本:(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的.因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error!注意事项:(1)不能返回局部变量的引用.这条可以参照Effective C++[1]的Item 31.主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态.(2)不能返回函数内部new

linux编程中接收主函数返回值以及错误码提示

程序A创建子进程,并调用进程B,根据不调用的不同情况,最后显示结果不同. #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #include <errno.h> int main() { pid_t pid, rpid; int stat; if ((pid = fork()) < 0) { perror("for