笔记:Python函数

  1. 调用函数
    Python内置了很多可以直接调用的函数
    调用一个函数,需要知道函数的名称和参数。
Python官方网站提供的文档
 https://docs.python.org/3/library/functions.html
如:
 1)abs() 求绝对值
 2)max() 获取最大值
 	接收任意多个参数,并返回最大那个
 Python内置的常用函数还包括数据类型转换函数
  如:str()函数可以把其他数据类型转换为字符串
  >>>str(500)
  '500'

函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个别名:

#变量w指向max函数
>>>w = max
#因此,也可以通过w调用max函数
>>>w(1,5,10,55)
55

在这里插入图片描述

  1. 定义函数
    在Python中,定义一个函数要使用def 语句,依次写出函数名、括号、括号中的参数和冒号: ,然后,在缩进块中编写函数体,函数的返回值用return 语句返回
自定义一个求最大数的`w_max`函数:
def w_max(a, b):
	if a > b:
		return a
	else:
		return b

保存该自定义函数至:py1.py
命令行模式切换到该文件的当前目录下启动Python解释器,用
from py1 import w_max 来导入w_max函数,#py1位文件名

在这里插入图片描述
空函数
如果想定义一个无任何操作的空函数,可以用pass语句

def empty_function():
	pass

pass可以用来作为占位符,比如现在还没有想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来,如:

if 1 > 0:
	pass
缺少pass,代码运行就会有语法错误

参数检查
调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出TypeError
但如果是参数类型不对,Python解释器就无法帮我们检查

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

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,但写起来更方便。

总结

定义函数时,需要确定函数名和参数个数;
如果有必要,可以先对参数的数据类型做检查;
函数体内部可以用return随时返回函数结果;
函数执行完毕也没有return语句时,自动return None。
函数可以同时返回多个值,但其实就是一个tuple。
  1. 函数的参数
    定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。
    Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
位置参数

fun1(x, y)函数有两个参数:xy,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数xy

默认参数

定义函数:求x的n次方

def w_power(x, y = 2):

当我们调用w_power(3)时,相当于调用w_power(3, 2)

  • 定义默认参数要牢记一点:默认参数必须指向不变对象!
可变参数

要定义出这个函数,我们必须确定输入的参数。由于参数个数不确定,我们首先想到可以把a,b,c……作为一个list或tuple传进来,这样,函数可以定义如下

def calc(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

但是调用的时候,需要先组装出一个list或tuple:

>>> calc([1, 2, 3])
14
>>> calc((1, 3, 5, 7))
84

如果利用可变参数,调用函数的方式可以简化成这样:

>>> calc(1, 2, 3)
14
>>> calc(1, 3, 5, 7)
84

如果利用可变参数,调用函数的方式可以简化成这样:

>>> calc(1, 2, 3)
14
>>> calc(1, 3, 5, 7)
84

所以,我们把函数的参数改为可变参数:

def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
  • Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:
>>> nums = [1, 2, 3]
>>> calc(*nums)
14

*nums表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。

  1. 递归函数
    在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
    阶乘为例:n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理

fact(n)用递归的方式写出来就是

def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)
  • 总结
使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。
针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。
Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值