本文python学习基于廖雪峰老师的学习网站:字符串和编码 - 廖雪峰的官方网站 (liaoxuefeng.com),其内容相对完整,适合初学者学习。由于楼主之前有c语言的学习经验,在此本文仅对其中与c语言相差比较大的部分进行总结回顾,如有纰漏还请指出。
前接:Python学习细节总结以及python与c语言区别比较(1)
5.函数
python内部贴心的设置了错误判断,在函数中如果传入的参数数量不对或参数类型不能被函数所接受,则会弹出TypeError的错误,除此以外,如果你的网络出现问题,服务器传输资源超载或者文件权限设置错误,则会弹出INTERNAL_SERVER_ERROR。我们可以通过isinstance()来检查数据类型,如
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
这样会在x不是int或float类型时弹出TypeError:bad operand type。
在python中定义一个函数要用def(),依次写出函数名、括号、括号中的参数和冒号,然后,在缩进块中编写函数体,函数的返回值用return
语句返回。如果没有return
语句,程序执行完毕后返回None。如果你将zzz()函数定义保存在了xxx.py文件中,你可以用代码from xxx import zzz来导入函数定义。
我们也可以定义一个空函数,即函数体内为pass,即函数内部无内容来作为一个函数的占位符,使你在函数还没想好的时候能运行代码。
函数可以返回多个值,但其实就是一个tuple。
我们也可以定义一个默认参数,使得函数内部部分值固定不变,但定义默认参数时一定要指向不变对象或者不轻易改动的参数,否则默认参数可能会出现重复输入的情况。
同样的我们也可以定义一个可变参数,它和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号,这样在输入参数不确定的情况下,使其在函数内部接收到的是一个tuple。同样我们也可以在list或tuple前加一个 * 号,把list或tuple的元素变成可变参数传进去。
我们在函数中可以定义一个关键字参数,即在需要的list或tuple前加 **,如person(name,age,**kw),从而使这个参数变成可选任意个输入的参数,即这部分可以不进行输入。同时如果要限制关键字参数的名字,就可以用命名关键字参数,如
def person(name, age, *, city, job):
print(name, age, city, job)
运用 *, 使person函数只接受job、city作为关键字参数,如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符 * 了,在输入参数的时候必须输入参数名,除非命名关键字参数已为默认参数否则会报错。
在使用递归函数时要防止栈溢出,即不要让函数递归次数过多(类似于越界),否则系统将无法处理并报错,我们可以通过尾递归优化的方式,即在递归函数外套用一个函数如
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)
来减少栈溢出的影响。(由于Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。)
在python中,如果对多个变量进行赋值,比如a,b=b,a+b,实质是t=(b,a+b),a=t[0],b=t[1],但不必显式写出临时变量t就可以赋值。