02:python-函数

    

 

正文

# 1:调用内置函数
# 调用绝对值函数 abs()
intAbs = abs(-20)
print(intAbs)

# 调用最大函数
intMax = max(1, 2, -1, 10)
print(intMax)

# 数据类型转换
print(int('124')) # 字符串转int
print(int(12.34)) # float转int
print(str(12.34)) # float转字符串
print(str(12))    # int转字符串

print('\n\n---2:定义函数 用def关键字---')
# 2:定义函数 用def关键字
# 在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
# python的返回值没有在声明的时候指出
'''
函数:小结

定义函数时,需要确定函数名和参数个数;
如果有必要,可以先对参数的数据类型做检查;
函数体内部可以用return随时返回函数结果;
函数执行完毕也没有return语句时,自动return None。
函数可以同时返回多个值,但其实就是一个tuple。
'''

# 声明:自定义绝对值函数
def my_abs(x):
    if not isinstance(x, (int, float())):
        raise TypeError('bad operand type')
    if x >= 0:
        return x
    else:
        return -x


# 调用
intx = my_abs(-11)
print(intx)

# 3:函数的参数
# 默认参数
def enroll(name, gender, age=6, city='Beijing'):
    print('name:', name)
    print('gender:', gender)
    print('age:', age)
    print('city:', city)

enroll('张三', 'F', 6, '北京')
enroll('lisi', '')
enroll('yiyi', '', city = '上海')
enroll('Bob', 'M', 7)

# 可变参数  把参数组装个数组 之后在数组前面加一个*
# 字符串拼接
def conAddArguments(*list):
    aStr = ''
    for str in list:
       aStr = '{}===={}'.format(aStr, str)
    return aStr


nameList = ['yiyi', 'yiyan', 'yixian']
# *nameList表示把nameList这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。
allStr = conAddArguments(*nameList)
print(allStr)

# 关键字参数
# 可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
# 而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
# kw是key:value的键值对

def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)

person('张三', 10)
person('lisi', 10, city='zhengzhou', sex='nan')

# 关键字参数核心写法
# **extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict,
# 注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra。
extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **extra)

# 参数组合
# a,b是普通参数 c是默认参数 *args是可变参数 **kw是关键字参数  
def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

# a,b是普通参数 c是默认参数 d是命名关键字参数 **kw是关键字参数  
def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)

# 所以,对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。
args1 = (1, 2, 3, 4)
kw1 = {'d': 99, 'x': '#'}
f1(*args1, **kw1)

args2 = (1, 2, 3)
kw2 = {'d': 88, 'x': '#'}
f2(*args2, **kw2)

'''
小结
Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。
默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!
要注意定义可变参数和关键字参数的语法:
*args是可变参数,args接收的是一个tuple;
**kw是关键字参数,kw接收的是一个dict。

以及调用函数时如何传入可变参数和关键字参数的语法:
可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3));
关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})。
使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。
命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。
'''

# 递归函数
# 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
# 使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。

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

factValue = fact(5)
print(factValue)

 

posted on 2023-04-06 20:27  风zk  阅读(42)  评论(0)    收藏  举报

导航