Python:3.函数

调用函数

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# 绝对值,只能接收一个参数
print(abs(-100))

# 最大值,可以接收任意多个参数,并返回最大的那个
print(max(1,2,3,6,9))

# 数据类型转换
print(int('123'))
print(int(12.34))
print(float('12.34'))
print(str(1.23))
print(str(100))
print(bool(1))
print(bool(''))

# 函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了个别名
a = abs
print(a(-1))

定义函数

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import math

# def语句:依次写出函数名、括号、括号中的参数和冒号:,然后在缩进块中编写函数体,函数的返回值用return语句返回。
'''
1. 如果没有return语句,也会返回结果,结果为None。return None可以简写为return
'''

# 把my_abs()的函数定义保存为abstest.py文件。在该文件的当前目录下启动Python解释器
# 用from 语句导入这个函数。注意:abstest是文件名
from abstest import my_abs
print(my_abs(-9))

# 空函数 pass语句 pass占位符
def nop():
    pass

# 参数检查。数据类型检查可以用内置函数isinstance()实现
def custom_abs(x):
    if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')
    if x >= 0:
        return x
    else:
        return -x

# 返回多个值,其实就是返回一个tuple,元祖
def move(x, y, step, angle=0):
    nx = x + step * math.cos(angle)
    ny = y - step * math.sin(angle)
    return nx, ny

print(move(100, 100, 60, math.pi / 6))

函数的参数

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''
1. 必选参数在前,默认参数在后
2. 当函数有多个参数时,把变化大的参数放在前面,变化小的放在后面。
3. 默认函数可以按顺序提供参数。也可以不按顺序,但是必须加上参数
4. 默认参数必须指向不可变对象
'''

# pow(x,2)的函数
def power1(x):
    return x * x

# x 的 n次方函数
def power2(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

# 默认参数
def power(x, n = 2) :
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s
print(power(2,4))
print(power(2,n=5))


# 可变参数
# 正常定义
def calc(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

print(calc([1,2,3]))
# 可变参数定义
def calc_mutable(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
print(calc_mutable(1,2,3))

nums = [4,5,6]
print(calc_mutable(*nums))

# 关键字函数:扩展函数功能
def person(name, age, **kw):
    print('name:',name, 'age:', age, 'other:', kw)

print(person('Michael',30))

extra = {'City':'Beijing', 'Job':'Coding'}
print(person('Jack', 24, **extra))

# 命名关键字参数:函数的调用者可以传入任意不受限制的关键字参数。
# 要限制关键字参数的名字,就可以用命名关键字参数。例如,只接收city和job作为关键字.命名关键字无默认值时必须传入参数
# 如果函数中已经定义了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*
# 通过*,区别位置参数和命名关键字
def person1(name, age, *, city, job):
    print(name,age,city,job)

person1('Jack',24,city='Beijing',job='Coding')

# 参数组合
'''
顺序:必选参数、默认参数、可变参数、命名关键字参数、关键字参数
'''
def f1(a, b, c=0, *args, **kw)
    print(a,b,c,args,kw)

def f2(a, b, c=0, *, d, **kw)
    print(a, b, c, d, kw)

f1(1,2)
f1(1,2,c=3)
f1(1,2,3,'a','b')
f1(1,2,3,'A','B',X=99)
f2(1,2,d=99,ext=None)

递归函数

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# 递归函数:一个函数在内部调用自身本身
def fact(n):
    if n == 1:
        return 1
    return n * fact(n-1)

print(fact(2))

'''
1. 注意防止栈溢出:函数调用是通过栈(stack)这种数据结构实现的。每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。
2. 解决递归调用栈溢出方法:尾递归优化。在函数返回时,调用自身本身,并且return语句不能包含表达式。这样编译器或者解释器就可以把尾递归做优化,
使递归本身无论调用多少次,都占用一个栈帧,不会出现栈溢出的情况。
'''
def face(n):
    return face_iter(n,1)

def face_iter(num, product):
    if num == 1:
        return product
    return face_iter(num-1, num * product)

print(face(10))

参考

  1. 廖雪峰的Python教程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容