一.流程图

 

 

 

 

 

二.函数相关的面试题:

1.定义函数式需要确定那两个因素?

  函数名和参数(参数类型)

 

2.如果函数中没有return那么这个函数的返回值是什么?

  反回的是None

 

3.函数是什么和函数式编程的主要思想是什么?

  函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

  增加代码的重用性和可读性

 

4.函数中有几种参数?

  一共有三种参数:

    普通参数:普通参数的传递并没有个数和数据类型的限制,可以传递字符串,数字,列表和字典。也不限定个数,需要注意的是:函数需要多少参数,

         调用的时候就要按照它定义时的顺序和数据类型传递过去。

    默认参数:默认参数是给参数加上一个默认的值,但我们调用函数的时候,如果传递了这个参数,那么使用我们传递过来的值;如果不传则使用默认的值,

         默认参数可以有多个,但是必须放在所有参数的最后。当我们有多个默认参数的时候,调用函数的时候可以使用参数名指定其中的某一个参数,以保证参数能准确的传递给被调用的函数。

         默认参数指向的必须是个不可变的对象。

    动态参数:def func(*args) 接受多个参数,内部自动构造元组,序列前加*,避免内部构造元组
                def func(**kwargs) 接收多个参数,内部自动构造字典,序列前加**,直接传递字典
           def func(*args,**kwargs):接受多个参数,既可以自动构造元组,又可以自动构造字典。

  还有一种说法是:必备参数、关键字参数、默认参数、不定长参数。

 

5.函数的参数是传值还是传引用?

  Python中传递的都是对象的引用,每个值的传递都是对象的引用,对象在这个过程中是不可复制的。

 

6.关于可更改对象和不可更改对象的原理是什么?

  不可更改对象被重新赋值时,相当于新生成了一个值,变量相当于是抛弃原来的值,从而指向新的值。

  可更改对象再被赋值时,并没有重新指向新的值,而是对当前的值进行替换。

 

7.Python的匿名函数。

  python 使用 lambda 来创建匿名函数:

    lambda只是一个表达式,函数体比def简单很多。

    lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

    lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。

    虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

 

8.变量作用域分为几种,性质有分别是什么?

  变量作用域分为两种全局变量和局部变量:

    全局变量:全局变量可以在整个程序范围内访问。

    局部变量:局部变量只能在其被声明的函数内部访问。

 

9.递归函数的定义和优点是什么?

     如果一个函数在自身内部调用它本身,那这个函数就是递归函数。

  递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

 

10.函数的特性。

  • 切片: 
    list: L[A:B:C] 
    A,表起始。B表结尾。C表隔几个去一次,不填则为默认参数 
    tuple: 也可以切片,但是取出后仍是tuple类型

  • 迭代: 
    普通迭代:for … in .. : 
    没有索引的,只要是可以迭代的对象(字符串也可以迭代),都可以。

    例如:dict默认迭代的是key值。
    for value in d.itervalues()   # 迭代
    for k, v in d.iteritems()
  • 判断对象是否可以迭代:
  通过collections模块的Iterable类型判断:
  from collections import Iterable
  isinstance('abc', Iterable) # str是否可迭代
  • 如果一个对象说自己可迭代,那我们就直接用 for 循环去迭代它,可见,迭代是一种抽象的数据操作,它不对迭代对象内部的数据有任何要求。 
    for 循环可作用的迭代对象远不止 list,tuple,str,unicode,dict等 
    for x, y in [(1, 1), (2, 4), (3, 9)]: #for里同时可以引用两个变量

  • Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:

   for i, value in enumerate(['A', 'B', 'C']):
   enumerate()把list返回一个包含索引-value值得形式。
  • 列表生成式L:
  体会快速生成列表的方法
   [x * x for x in range(1, 11) if x % 2 == 0]
   [m + n for m in 'ABC' for n in 'XYZ']
   [x * x for x in range(1, 11)]
  • 生成器G: 
    列表元素按照某种算法推算出来,一边循环一边计算推算出后来的元素,可以节约大量空间

    创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。 
    generator是可迭代对象,直接用for可以遍历

    另外一种定义的方法:如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

   def fib(max):
      n, a, b = 0, 0, 1
      while n < max:
          yield b
          a, b = b, a + b
          n = n + 1

 

posted on 2018-02-12 21:21  轩愿玄  阅读(177)  评论(0编辑  收藏  举报