[toc]

python 函数(二)

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

count 是外层函数的局部变量,被内部函数引用

内部函数使用nonlocal 关键字声明count 变量是在上一级作用域中

1

2

3

4

5

6

7

8

9

10

11

12

13

14In [2]: def counter():

...: count =0

...: def inc():

...: nonlocal count

...: count +=1

...: return count

...: return inc

In [3]: foo = counter()

In [4]: print(foo())

1

In [5]: print(foo())

2

In [6]: print(foo())

3

默认值的作用域1

2

3

4

5

6

7

8

9

10

11In [7]: def foo(xyz=[]):

...: xyz.append('100')

...: print(xyz)

...:

In [8]: foo()

['100']

In [9]: foo()

['100', '100']

In [10]: foo()

['100', '100', '100']

例子

1

2

3

4

5

6

7

8

9In [1]: def foo(xyz=[],u='abc',z=123):

...: xyz.append(1)

...: return xyz

In [2]: print(foo(),id(foo))

[1] 4569788064

In [3]: print(foo.__defaults__)

([1], 'abc', 123)

In [4]: print(foo(),id(foo))

[1, 1] 4569788064

函数地址并没有变,就是说函数这个对象的没有变,调用它,它的属性defaults中使用元组保存所有默认值;

xyz 默认值是引用类型,引用类型的元素变动,并不是元组的变动;

1

2

3

4

5

6

7

8

9

10

11In [8]: def foo(w,u='abc',z=123):

...: u = 'xyz'

...: z = 789

...: print(w,u,z)

In [9]: print(foo.__defaults__)

('abc', 123)

In [10]: foo('asjin')

asjin xyz 789

In [11]: print(foo.__defaults__)

('abc', 123)

属性defaults 中使用元组保存所有默认值,它不会因为在函数体内使用了它而发生改变;

可变类型默认值,如果使用默认值,就可能修改这个默认值;

有时候这个特性是好的,有的时候这种我是不是好的,有副作用;

第一种方法

使用影子拷贝创建一个新的对象,永远不能改变传入的参数;

第二种方法

通过值的判断就可以灵活的选择创建或者修改传入对象;

这种方式灵活,应用广泛 ;

很多函数的定义,都可以看到使用None这个不可变的值作为默认参数,可以说是这一种惯用法。

函数的销毁* 全局函数销毁

重新定义同名函数

del 语句删除函数对象

程序结束时1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22In [5]: def foo(xyz=[], u='abc', z=123):

...: xyz.append(1)

...: def inner(a=10):

...: pass

...: print(inner)

...: def inner(a=100):

...: print(xyz)

...: print(inner)

...: return inner

In [6]: bar =foo()

.inner at 0x10529dbf8>

.inner at 0x1053c8f28>

In [7]: print(id(foo),id(bar), foo.__defaults__, bar.__defaults__)

4382889232 4382822184 ([1], 'abc', 123) (100,)

In [8]: del bar

In [9]: print(id(foo),id(bar), foo.__defaults__, bar.__defaults__)

---------------------------------------------------------------------------

NameError Traceback (most recent call last)

in ()

----> 1 print(id(foo),id(bar), foo.__defaults__, bar.__defaults__)

NameError: name 'bar' is not defined

树非线性结构,每个元素可以有多个前驱和后继

树是n(n>=0)个元素的集合

n = 0 时, 称为空树;

树只有一个特殊的没有前驱的元素,称为树的根Root;

树中除了根结点外,其余元素只能有一个前驱,可以有零个或多个后继;

递归定义

树T是n(n>=0)个元素的集合。n=0时,称为空树;

有且只有一个特殊元素根,剩余元素都可以被划分为m个互不相交的集合T1、T2、T3、… Tm,而每一个集合都有树,称为T的子树Subtree

子树也有自己的根

树的概念结点: 树中的数据元素;

结点的度degree:结点拥有的子树的数目称为度,记作d(v);

叶子结点: 结点的度0, 称为叶子结点leaf、终端结点、末端结点;

分支结点: 结点的度不为0, 称为非终端结点或分结点;

分支: 结点之间的关系;

内部结点: 除根结点外的分支结点,当然也不包括叶子结点;

树的度是树内各结点的度的最大值。D结点度最大为3,树的度数就是3;

孩子(儿子Child)结点: 结点的子树的根结点成为该结点的孩子;

双亲(父Parent)结点: 一个结点是它各子树的根结点的双亲;

兄弟(Sibling)结点: 具有相同双亲结点的结点;

祖先结点: 从要结点到该结点所经分支上所有的结点。 A、B、D 都是G的祖先结点;

子孙结点: 结点的所有子树上的结点都称为该结点的子孙。B的子孙是D、G、H、I

结点的层次(Level): 根节点为第一层,根的孩子为第二层,以此类推,记作L(v)

树的深度(高度Depth); 树的层次的最大值。上图的树深度为4

堂兄弟:双亲在同一层结点。

有序树: 结点的子树是有顺序的(兄弟有大小,有先后次序),不能交换。

无序树: 结点的子树是无序的,可以交换;

路径: 树中的k 个结点n1、n2、….、nk ,满足n1是n(i+1)的双亲,成为n1到nk的一条路径。就是一条线串下来的,前一个都是后一个父(前驱)结点。

路径长度=路径 上结点-1,也是分支数;

森林:m(m>=0)棵不相交的树的集合;

对于结点而言,其子树的集合就是森林。A结点的2棵子树的集合就是森林。

树树的特点

唯一的根

子树不相交

除了根以外,每个元素只能有一个前驱,可以有零个或多个后继;

根结点没有双亲结点(前驱),叶子结点没有孩子结点(后继)

vi是 vj 的双亲,则L(vi) = L(vj)-1,也就是说双亲比孩子结点的层小1

二叉树每个结点最多2棵了树

二叉树不存在度数大于2的结点

它是有序树,左子树、右子树是顺序的,不能交换次序;

即使某个结点只有一棵子树,也要确定它是左子树还是右子树;

二叉树的的五种基本形态

空二叉树

只有一个根结点

根结点只有左子树

根结点只有右子树

根结点有左子树和右子树

斜树左斜树,所有结点都只有左子树;

右斜树,所有节点都只有右子树;

满二叉树

一棵二叉树的所有分支结点都存在左子树和右子树,并且所有叶子结点只存在在最下面一层;

同样深度二叉树中,满二叉树结点最多;

k 为深度(1<=k<=n),则结点总数为2^k-1;

完全二叉树Complete Binary Tree若二叉树的深度为k, 二叉树的层数从1到k-1层的结点数都达到了最大个数,在第k层的所有结点都集中在最左边,这就是完全二叉树;

完全二叉树由满二叉树引出;

满二叉树一定是完全二叉树,但完全二叉树不是满二叉树;

k为深度(1<=k<=n),则结点总数最大值为2^k-1,当达到最大值的时候就是满二叉树;

二叉树性质对任何一棵二叉树T,如果其终端节点数为n0,度数为2的结点为n2,则有n0=n2+1;

换句话说,就是叶子结点数-1就等于度数为2的结点数;

证明:

总结点数为n=n0+n1+n2,n1为度数为1的结点数;

一棵树的分支数为n-1,因为除了根结点外,其余结点都有一个分支,即n0+n1+n2-1;

分支数还等于n0*0+n1*1+n2*2,n2 是2分支结点所以乘以2,2*n2+n1。

可得2*n2+n1 = n0+n1+n2-1 => n2 =n0-1

其他性质

高度为k的二叉树,至少有k个结点;

含有n(n>=1)的结点的二叉树高度至多为n,和上句一个意思;

含有n(n>=1)的结点的二叉树高度至多为n,最小为meth.ceil(log2(n+1)),不小于对数值的最小整数,向上取整;

假设高度为h,2^h-1=n => h= log2(n+1),层次数是取整。如果是8个节点,3.1699就要向上取整为4, 为4层。

具有n 个结点的完全二叉树的深度为int(log2n)+1 或者meth.ceil(log2(n+1))

性质5如果有一棵n个结点的完全二叉树,结点按照层序编号;

如果i=1, 则结点i是二叉树的根,无双亲;如果i>1,则其双亲是int(i/2),向下取整。就是子节点的编号整除2得到的就是父结点的编号。父结点如果是i,那么左孩子结点就是2i,右孩子结点就是2i+1;

如果2i>n, 则结点i无左孩子,即结点i为叶子结点;否则其左孩子结点存在的编号为2i;

如果2i+1 >n,则结点i无右孩子,注意这里并不能说明结点i 没有左孩子; 否则右孩子结点存在编号为2i+1。

格言

有恒,乃为作圣之基

凡人作一事,便须全副精神注在此一事,首尾不懈,不可见异思迁,做这样想那样,坐之山望那山。人而无恒,终身一无所成。

python两数交换 函数_python 函数(二)相关推荐

  1. python两数交换 函数_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...

    从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用. 最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值: >>> ...

  2. python两数相乘代码_Python 实现大整数乘法算法的示例代码

    我们平时接触的长乘法,按位相乘,是一种时间复杂度为 O(n ^ 2) 的算法.今天,我们来介绍一种时间复杂度为 O (n ^ log 3) 的大整数乘法(log 表示以 2 为底的对数). 介绍原理 ...

  3. 【牛客网】C语言入门 - CC3 编写函数实现两数交换(指针方式)

    题目描述 题目链接:编写函数实现两数交换(指针方式) 描述 编写一个函数,实现两个整数的交换,要求采用指针的方式实现. 输入描述: 键盘输入2个整数 m 和 n 输出描述: 输出交换后m 和 n 的值 ...

  4. 左神讲算法——异或的高级操作(两数交换+经典面试题)

    目录 1. 异或的性质 2. 两数交换 3. 经典面试例题 参考链接:2021最新左神数据结构算法全家桶 1. 异或的性质 异或可以看成相同为1,不同为0:也可以看作无进位相加,有奇数个1则结果为1, ...

  5. Java中两数交换引发的值传递问题及解决方案

    Java中两数交换引发的值传递问题及解决方案 今天导师分享了一个有趣的代码,记录一下,让我们一起看看~ //交换两个整数 private static void swap(int i, int j) ...

  6. 关于C语言异或实现两数交换的理解

    首先麻烦了解这篇csdn文章: 使用异或运算实现两数交换_无关风月-CSDN博客_异或实现两数交换 异或^:相同为0:不同为1: 对于b=a^b^a;//我始终没有比较好的理解. 后来通过b/a*a, ...

  7. python交换两个值原理_python 两数交换新写法原理

    今天学python,突然发现没有swap函数,那怎么交换两个数呢,难道手写交换,那效率太差了 我们看一下实例 a = 1b= 2a,b=b,aprint(a,b) 其实很简单的原理,然而我却琢磨了半天 ...

  8. python nums函数_Python函数

    一.简介 函数是可重用的程序代码块.函数的作用,不仅可以实现代码的复用,更能实现代码的一致性.一致性指的是,只要修改函数的代码,则所有调用该函数的地方都能得到体现. 函数用关键字def来定义,def关 ...

  9. python圆面积函数_python函数题

    请大家严格按照下面顺序编写圆形生成器程序. : 定义函数getCircleArea(r),可以对指定r计算圆面积.计算公式math库的pi*r*r. 定义函数get_rList(n),功能:输入n个值 ...

最新文章

  1. LeetCode简单题之在既定时间做作业的学生人数
  2. java 数据聚合_Java数据聚合问题请教?
  3. swing GeneralPath::cubicTo绘制平滑曲线
  4. conda创建虚拟环境 和 用conda创建GPU的cuda、cudnn使用环境
  5. 以对象的形式动态获取宽高
  6. 微服务网关路由过滤作用介绍
  7. c# 衍生类和基类的构造顺序
  8. 1 京东_推荐好友拿好礼 | 每1积分可兑换30元京东电子卡
  9. linux gret 文件内容,DataX插件开发指南.docx
  10. struts2.0.14 web.xml,struts.xml配置
  11. Learn ZYNC (6)
  12. AndroidStudio使用gradle出现Could not download... 或unable to resolve dependency for...
  13. winhex数据恢复入门教程
  14. Windows系统睡眠和休眠的区别
  15. 介绍解决方案、项目和项
  16. 数据,模型,算法共同决定深度学习模型效果
  17. signature=5a522a8356f9906b0b775bdada02a4c6,阜阳境内车辆违章信息公示(4月3—4月23)
  18. 自由Android安全研究员陈愉鑫:移动App灰色产业案例分析与防范
  19. System.Diagnostics.Process.Start 用法
  20. Spring框架技术总结(一)

热门文章

  1. linux系统 修改文件权限
  2. EXCEL 文件页眉打开有乱码
  3. shiro第一讲 没有Realm的实例
  4. 完全立方体计算的多路数组聚集
  5. Java 并发工具包(concurrent)详解
  6. 国际大牌辐轮王自行车点赞进博会入选央视2020国内十大新闻
  7. 学习笔记—babel转码器,babel是什么
  8. 最新十款免费英文字体资源下载
  9. Linux USB U盘热插拔挂载和卸载
  10. 基于文本情感分析和LSTM的股票趋势预测