调用函数
#!/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))
参考
- 廖雪峰的Python教程