Python 学习笔记5 (函数)

1:py内置函数

首先py有一个和c语言一样的内置函数abs()使用和c语言一样
还有max和min,和c语言稍微有点区别,因为他的维数可以是多个,即你可以比较多个值的最大最小值,而且可以double和int一起比较

调用函数的时候,如果传入的参数数量不对,会报TypeError的错误,并且Python会明确地告诉你:abs()有且仅有1个参数,但给出了两个:

>>> abs(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: abs() takes exactly one argument (2 given)

如果传入的参数数量是对的,但参数类型不能被函数所接受,也会报TypeError的错误,并且给出错误信息:str是错误的参数类型:

>>> abs('a')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: bad operand type for abs(): 'str'

Python内置的常用函数还包括数据类型转换函数,比如int()函数可以把其他数据类型转换为整数:
这个和c语言稍有不同,c语言如果(int)‘a’会变成ascll码, 这个py的强转就会报错,py的强转感觉更加智能,两种转化各有不同,看代码应该就能理解了

>>> int('123')
123
>>> int(12.34)
12
>>> float('12.34')
12.34
>>> str(1.23)
'1.23'
>>> str(100)
'100'
>>> bool(1)
True
>>> bool('')
False

log()函数(来源:https://www.jb51.net/article/66130.htm)
log()是不能直接访问的,需要导入 math 模块,通过静态对象调用该方法。

import math
math.log( x )

注意:此函数是无法直接访问的,所以我们需要导入math模块,然后需要用math的静态对象来调用这个函数。
参数

x – 这是一个数值表达式。

返回值:此方法返回x的自然对数,对于x>0。例子

下面的例子显示了log()方法的用法。

#!/usr/bin/python
import math  # This will import math module
 
print "math.log(100.12) : ", math.log(100.12)
print "math.log(100.72) : ", math.log(100.72)
print "math.log(119L) : ", math.log(119L)
print "math.log(math.pi) : ", math.log(math.pi)

当我们运行上面的程序,它会产生以下结果:

math.log(100.12) : 4.60636946656
math.log(100.72) : 4.61234438974
math.log(119L) : 4.77912349311
math.log(math.pi) : 1.14472988585

另外,可以通过log(x[, base])来设置底数,如 log(x, 10) 表示以10为底的对数。

定义函数

定义函数py不要写返回类型(显然因为他是动态语言),看下面的模板应该就懂了,前面写个def其他的和c语言没什么不同

def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x

如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。return None可以简写为return。类似于c语言的return ;
本质和c语言类似

如果想定义一个什么事也不做的空函数,可以用pass语句:

def nop():
    pass

pass语句什么都不做,那有什么用?实际上pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。

pass还可以用在其他语句里,比如:

if age >= 18:
    pass

缺少了pass,代码运行就会有语法错误。如果是c语言就不会,因为c语言可以直接打一个大括号就行了,感觉pass在py中还是有比较重要的作用的。

c语言的函数只能传回一个参数,但是py可以看起来传回多个参数

函数可以返回多个值吗?答案是肯定的。

比如在游戏中经常需要从一个点移动到另一个点,给出坐标、位移和角度,就可以计算出新的坐标:

import math

def move(x, y, step, angle=0):
    nx = x + step * math.cos(angle)
    ny = y - step * math.sin(angle)
    return nx, ny

import math语句表示导入math包,并允许后续代码引用math包里的sin、cos等函数。

然后,我们就可以同时获得返回值:

>>> x, y = move(100, 100, 60, math.pi / 6)
>>> print(x, y)
151.96152422706632 70.0

但其实这只是一种假象,Python函数返回的仍然是单一值:

>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)

原来返回值是一个tuple!但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。

函数参数

有很多传参的方法,但是我感觉在写题目时意义不大,只是粗略的看了一下,感觉用c语言的那个传参就行了(py是真的传参方法多
以后要用到的时候再去详细的学习一下

递归

和c语言基本一样,了解一下尾递归,感觉和递归没什么区别,区别就是他的return 直接是自己的函数没有乘什么东西

解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。

尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

上面的fact(n)函数由于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)

可以看到,return fact_iter(num - 1, num * product)仅返回递归函数本身,num - 1和num * product在函数调用前就会被计算,不影响函数调用。

猜你喜欢

转载自blog.csdn.net/m0_46209312/article/details/107921996