温故知新python3--基础知识2(函数基础)

来源:互联网 发布:粒子群算法电子书 编辑:程序博客网 时间:2024/06/05 14:10

我们的目标是星辰大海,fighting!
以下内容为个人学习“廖雪峰python3教程”的学习笔记。
参考网站:
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
函数是最基本的一种代码抽象。以下内容将涉及:函数的调用、函数的定义、函数的参数及递归函数。

函数的调用:
TypeError:调用函数时所用的参数数量或类型不符合函数要求。
有些函数如max的参数个数是没有限制的。
函数名实际上是对函数对象的引用,因此能把它赋给其他变量,从而达到不同变量可调用相同函数的效果。
强调一下,python的print与C中的print还是有一点差别的,在前一章中我把两者混为一谈了,实在抱歉。print(“内容 %格式符” %变量)这样才能得到正确的输出!!!

函数的定义:
函数内的语句执行到return语句时,将跳出;如果没有return语句,则将在执行结束后返回None。
空函数:在函数语句中只放语句pass即可。此外pass还可以用在如判断语句等的处理中,用来跳过该处。
为了提供不同参数使用问题带来的程序报错信息,在进入函数时,常常使用内置函数对参数进行判断,比如: if not isinstance(x,(int,flaot)): raise TypeError(‘bad operand type’)。
补充关于元组的一点点知识:
tu = (1,2)
a, b = tu
可以使a等于1,b等于2,记住:这种情况下,变量数必须等于元组成员数,否则会出问题。

函数的参数:
python的函数可以带默认参数、可变参数、必选参数、关键字参数,这将使得函数的功能十分强大,同时降低了调用难度。
如果函数带多个参数,则调用时,参数的顺序可以不遵循原定义的顺序,但必须指明是和参数。
由于定义函数时,将会创建默认参数的对象,如果默认参数是可变对象,则在每一次调用时如果改变了该参数的值,则下一次调用时,该参数已经不是原定义函数的参数值了,而是上次调用的结果。因此,使用默认参数时必须将默认参数指向如str、None之类的不可变对象。

def my_abs(n, m = [-1,-2]):    n = abs(n)    i = len(m)    while i>0 :        m[i-1] = abs(m[i-1])        i -= 1    m.append(1)    return n, m

运行得到如下结果:

>>>my_abs(-1,[-2,-3])(1, [2, 3, 1])>>>my_abs(-1)(1, [1, 2, 1])

而参考网站中的例子:

def add_end(L=[]):    L.append('END')    return L

运行得到如下结果:

>>> add_end()['END', 'END']>>> add_end()['END', 'END', 'END']

这似乎说明,默认参数指向可变对象时,调用函数候默认参数是否会被改变是不确定的,因此,定义函数时,应使默认函数指向不可变对象。

可变参数:即参数的数目可以发生改变。如果使用列表或者元组,则代码写起来比较繁琐,可以直接在变量钱添加*符号,从而使其成为可变参数。此外,在list或者tuple前添加星号可以将其变成可变参数从而传递进去。
可变参数用两个星号定义,如**kw,在调用函数时可以赋任意个数的参数,这些参数最终将根据给定的参数名自动组合成为字典。

def person(name, age, **kw):    print('name:', name, 'age:', age, 'other:', kw)
>>> person('Bob', 35, city='Beijing')name: Bob age: 35 other: {'city': 'Beijing'}>>> person('Adam', 45, gender='M', job='Engineer')name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

*表示将变量的成员当作list或tuple的成员传递进函数。
**表示将变量的成员当作字典成员传递进函数。

命名关键字参数:为了得到指定的参数(包括限定参数的个数),可以使用‘参数1, *, 参数2,参数3’的格式,使得函数在调用时,必须指定星号后的参数名,如my_abs(1,参数2=0,参数3=9)。如果不这样调用,则会报错。

小结:可变参数用星号;关键字参数用两个星号;命名关键字参数用星号加逗号。

参数组合:按照“必选参数、默认参数、可变参数、命名关键字参数、关键字参数”顺序可以定义有多种参数类型的函数。
递归函数:一般递归函数和尾递归函数。一般递归函数在return后加上了表达式,而尾递归函数则在return调用函数。大多数编译器包括python编译器,对尾递归函数并没有进行优化,递归次数较大时,就会出现溢出问题。
一般递归函数:

def fact(n):    if n==1:        return 1    return n * fact(n - 1

尾递归函数:

def fact(n):    return fact_iter(n, 1)def fact_iter(num, product):    if num == 1:        return product    return fact_iter(num - 1, num * product)

好啦,函数的基础知识就先到这里啦,我得放下去这边,先去写一小片代码,晚点见。