python 下函数使用小结

243 阅读2分钟

###相关

  • 定义
def 函数名(参数):
    函数体
return 返回值
如果没有return语句,函数执行完毕后也会返回结果,只是结果为 None

  • 返回值

    ·python函数可以返回“多个值” 比如在游戏中经常需要从一个点移动到另一个点,给出坐标、位移和角度,就可以计算出新的坐标:# math包提供了sin()和 cos()函数,我们先用import引用它

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

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

# 这只是一种假象,Python函数返回的仍然是单一值:
r = move(100, 100, 60, math.pi / 6)
print (r) # (151.96152422706632, 70.0) #只是一个tuple

# 可以使用_ 舍弃一个不需要的值
x, _ = move(100, 100, 60, math.pi / 6)
print(x) #151.96152422706632
  • 递归函数

    计算阶乘

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

    使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。可以试试计算 fact(10000)。

  • 可变参数

    def func(*params):

   ...   
 函数定义成这样之后我们就可以传入任意数量的参数如:func(1,2) func(1,2,3)

# 示例1
def mySum(*params):
    sum = 0
    for value in params:
        sum += int(value)
    return sum
print(mySum(1,2,3)) # 6

# 示例2 
# 多个实参,放到一个元组里面,以*开头,可以传多个参数;**是形参中按照关键字传#值把多余的传值以字典的方式呈现

def foo(x,**kwargs):
    print(x)
    print(kwargs)
foo(1,y=1,a=2,b=3,c=4) #将y=1,a=2,b=3,c=4以字典的方式给了kwargs

# 执行结果如下
1
(2, 3, 4)
{'y': 1, 'a': 2, 'b': 3, 'c': 4}

# 示例3
def safe_loads_json(json_str, **kwargs):
    try:
        return json.loads(json_str)
    except:
       print('loads data failed use default value')
        if kwargs.get('default') is not None:
            return kwargs.get('default')
        else:
            return {}

print safe_load_json('',[]) # []
print safe_load_json('') # {}
print safe_load_json('{"a": 1}') # {'a':1}