一.流程图:
二.函数相关的面试题:
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