2019.4.16 函数篇

第五章 函数---178页

函数  ---  递归    还有什么吗   参数,返回值

对哦其实,有了数据,数据类型,控制语句

就已经足够了  完全够解决很多的问题了  那为什么还要函数呢?函数拿来干嘛?

因为我们要少写一写重复的代码,然后函数就诞生了  我们把函数封装到里边

这样函数就是重用的模块了   也只是增加了函数调用,传递参数,返回计算结果

底层内存分析才是上道吗

值得一提的是,Python 中有一类函数称为匿名函数,除了没有函数名,与正常函数无异。
匿名函数语法格式为:lambda[arg1,arg2,...]:expression
匿名函数适用场合:代码中存在一次函数引用的场合
匿名函数调用方式:匿名函数定义时直接被调用

 

函数就是一个模块啊  就是把前面我们学习的数据,字典,列表,控制语句包裹起来

然后给个名字,当我们再次使用这个东西的时候,再调用  function 函数,功能

内置函数

标准库函数 import导入库

第三方库函数  python社区,下载安装之后,import语句导入

用户自定义函数

先定义后调用

万物皆对象 ----函数也是对象    栈    堆   内存存储

 

68. 形参和实参_文档字符串-函数注释

  参数一定要对应,有就一定要传的,文档注释。help(函数名.__doc__)

69.返回值详解

  可以有返回值,因为要对返回的值再进行操作嘛

  还有一个功能就是结束函数执行    就是这两个作用 

  可以作为一个列表,元祖,字典返回的

70.函数也是对象_内存分析

  我们可以看出变量c和pritn_star 都是指向了同一个函数对象,因此,执行

  c(3),print_star(3) 的效果是完全一致的。圆括号意味着调用函数,没有圆括号

  的情况下,python会把函数当做普通对象

  定义函数的时候,对象已经建好了,所以每次调用的时候,不用再重建函数了

  函数是对象,所有可以用作参数和返回值   内部的存储就容易理解了  递归,装饰器

 

71 全局变量  局部变量

  当我在函数中定义global是就会改变全局变量的值

  局部变量存在栈帧里边,函数消失,局部变量也消失

  在局部变量中不能直接用全局变量的,因为在局部中没定义多,所以认为的是全局的变量

  用global的时候,就指定了他是全局变量的a  locals()globals()全局变量不仅只有自己定义的 

73.传递可变对象_内存分析

      他都是根据内存的存储来告诉我们为什么相等, 传递可变对象的引用

     一般我们传的是不可变的对象  字符串,int 元祖  因为不能做变量名,做了变量名会重新创建这个变量名的

  传参本质:从实参到形参的赋值操作   所以在python中参数的传递都是“引用传递”不是值传递

  传的是地址   都是叫做引用地址的赋值  记得局部变量在函数消失之后而消失

74.传递不可变参数  

   在“赋值操作”,由于不可变对象无法修改系统会新创建一个对象

   所以在以前的  n = n+1  没次都会重新的创建对象吗

75.深浅拷贝

    那请问我在什么时候会用到这个鬼东西,深拷贝不会改变源对象值

    为了更了解参数传递的底层原理吗?

    浅拷贝:只拷贝自己,自己下面的不考虑

    深拷贝:全部的都会拷贝,子代什么的

    对象的引用      [2,3,4[6,7]]   [6,7]是子对象吗    他们的子列表还是共用的

    浅拷贝,只拷贝第一个

    

 

   对象引用指向的问题  地址  他们是如何分配的  如何指向的,记得局部变量 会消失的

  

 

  内存中怎么存的   栈  堆    变量名  地址(id)type  value

 

75 传递不可变对象包含的子对象是可变的情况   这就是浅拷贝了

   传递不可变对象是浅拷贝

   对哦  以前好像都没注意参数的位置  还有局部变量,全局变量的东西

   卧槽  它里面嵌套了列表  列表是可变的  

 

77.参数的类型1

 位置参数  默认参数  关键字传参(命名参数)

  关键字传参可以不考虑位置,会根据变量找的

  默认值参数放到位置参数后面

 可变参数:*param,将多个参数收集到一个元祖对象中

      **param,将多个参数收集到一个字典对象中

  输出进行格式的改变是一定要想起format()

78.参数的类型2

  可变参数:当位置参数匹配完了,剩下的就是元祖,字典的了

  强制命名参数:再带星号的“可变参数”后面增加新的参数,必须是“强制命名参数”

79.lambda表达式和匿名函数

  有意思,它不需要返回值吗?

  lambda就是匿名函数吗? 只有一个表达式吗? 

  def都不需要,只需要lambda  函数也是对象,只是调用的方法不一样而已

  其他的都一样  有些东西都是一样的  只是可能加了点皮  退一步其实都一样的 

  对象   对象的引用  都是对象  都可以引用地址

80.eval()函数用法

  针对字符串的

81递归函数_调用内存分析-栈帧的创建

  什么是递归函数列,就是自己调自己

  方法也是函数啊  也在函数中使用  也是递归吗?

  利用的是栈的原理  先进后出   就是栈的内存原理

  两个条件:递归什么时候结束,一般用于返回值,不再自己调用自己

       把第N步的值和第n-1步相关联

  依次结束,因为要等上面的结束完下面的才能关闭   每个函数的内容都会执行一次的

  有意思的递归  12345  54321

要等上边返回来结果,然后才能结束

分析几何都可以用递归画出来

 

 

83嵌套函数(内部函数)

  闭包会用到    怎么作用呢   在内部嵌套的话呢   def  这个函数式局部变量的

  所以在外边是不能调用的   只能在内部    数据隐藏吗

84.nonlocla 关键字

  函数的嵌套,当想内函数使用外函数时的变量是  可以使用nonlocla关键字

  每个函数都有自己的局部变量

  很像global

85 LEGB规则

  我想起来了,就是什么呢?找一个变量的时候呢,要先从函数内部开始

  一个个的往外  局部,嵌套(闭包),模块,内置

 

函数总结:参数,作用域,递归,返回值,闭包

posted @ 2019-04-16 22:04  AJking  阅读(158)  评论(0编辑  收藏  举报