Python3(3) Python 函数

本系列主要学习Python的基本使用和语法知识,后续可能会围绕着AI学习展开。
Python3 (1) Python语言的简介
Python3 (2) Python语法基础
Python3 (3) Python函数
Python3 (4) Python高级特性
Python3 (5) Python 函数式编程
Python3 (6) Python 模块
Python3 (7) Python 面向对象编程
Python3 (8) Python 面向对象高级编程
Python3 (9) Python 错误、调试和测试
Python3 (10) Python IO编程
Python3 (11) Python 进程和线程
Python3 (12) Python 常用内建模块
Python3 (14) Python 网络编程
函数部分主要有函数的调用、函数的定义、函数的参数(参数部分比较难,相对于java增加了好多新的概念,参数可以各种组合)、函数的递归。

函数的调用

为什么先强调函数的调用呢,因为Python有好多内置函数,可以为我们解决各种问题。举几个例子:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
//abs() 获取绝对值,我们可以直接调用
x = abs(100)
//abs 赋值给a, 相当于a指向了abs函数,这也体现python赋值的强大之处
a = abs
y = a(-20)
// int、str ...数据转化函数,可以对数据进行转换,前提是可以相互转换的数据
z = int('123')
s = str(True)
print(x, y,z,s)
//数学类函数
print('max(1, 2, 3) =', max(1, 2, 3))
print('min(1, 2, 3) =', min(1, 2, 3))
print('sum([1, 2, 3]) =', sum([1, 2, 3]))

输出结果:

100 20 123 True
max(1, 2, 3) = 3
min(1, 2, 3) = 1
sum([1, 2, 3]) = 6

python内置函数的调用中,如果参数不匹配会出现 TypeError 错误:

Traceback (most recent call last):
  File "F:/python/HelloWord/call_func.py", line 4, in <module>
    x = a(100,200)
TypeError: abs() takes exactly one argument (2 given)

函数的定义

在Python中,定义一个函数要使用def语句,依次写出函数名括号括号中的参数冒号:,然后,在缩进块中编写 函数体,函数的返回值用return语句返回,注意python中没有大括号。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import math
//自定义一个取绝对值的函数
def my_abs(x):
     //自定义类型异常捕获机制,关键字 isinstance  
    if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')
    if x >= 0:
        return x
    else:
        return -x

n = my_abs(-20)
print(n)
# TypeError: bad operand type:
# my_abs('123')

输出结果:

20
  • 在函数中,一旦执行到return时,函数就执行完毕,并将结果返回,如果没有return 函数执行完成后默认 return None , 函数中 return None 可以简写成 return。
  • 自定义的函数,参数类型不会像内置函数抛出 TypeError 异常,可以自定义TypeError 异常,来保证函数的严谨性。

空函数

def no_fun():
    pass
print(no_fun())

输出结果:

None

空函数的定义: 可以通过关键字 pass 来做函数体 意思很明显,直接通过

函数返回值

python 中支持多参数返回,实质上是返回一个tuple!

def move(x, y, step, angle=0):
    nx = x + step * math.cos(angle)
    ny = y - step * math.sin(angle)
    return nx, ny
// 多参数接收
x, y = move(100, 100, 60, math.pi / 6)
// 单参数接收
n =  move(100, 100, 60, math.pi / 6)
print(x, y,n)

输出结果:

151.96152422706632 70.0 (151.96152422706632, 70.0)

函数参数

函数的参数定义非常的灵活,支持必选参数、位置参数、默认参数、可变参数、关键字参数等、并且这些参数可以组合使用。

必选参数

def myPower(x):
    return x * x
print("myPower (2)= ",myPower(2))

输出结果:

myPower(2) =  4

参数x为必选参数,否则TypeError: myPower() missing 1 required positional argument: 'x'

位置参数

def myPower(x,n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

print("myPower = ",myPower(2,5))

输出结果:

myPower =  32

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

默认参数

默认参数相当于java的重载,一个函数传入不同个数的参数,没有传的参数,会有默认参数来代替

def myPower(x,n = 2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

print("myPower = ",myPower(2))

输出结果:

myPower =  4
  • 注意定义函数时,必选参数在前,默认参数在后
  • 变化大的的默认参数在前,变化小的默认参数在后,符合使用规则
  • 默认参数代替了java 中因为参数个数引起的重载,减少了函数的定义
  • 定义默认参数要牢记一点:默认参数必须指向不变对象!
    比如定义一个函数,传入一个默认参数list:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def my_list(L=[]):
    L.append('END')
    return L
N = my_list([1,2,3,4,5])
print(N)
# 第一次调用参数
K = my_list()
print(K)
# 第二次调用参数
R = my_list()
print(R)
print('--------------------')
def my_list1(L = None):
    if L is None:
        L = []
    L.append('END')
    return L
# 第一次调用参数
K1 = my_list1()
print(K1)
# 第二次调用参数
R1 = my_list1()
print(R1)

输出结果:

[1, 2, 3, 4, 5, 'END']
['END']
['END', 'END']
--------------------
['END']
['END']

以上就可以看到,如果定义函数时,参数为list: L = [ ] 在多次使用默认参数时 就会出现 重复添加的情况,原因也很简单,我们定义了一个默认参数的值就会创建一个数据对象,函数执行完返回的值会存储在数据对象中,所以再次调用会呈现累加的情况,我们可以给参数定义一个None L = None 特殊的一个空对象(这个对象是不变的),这样就不会造成累加的情况了。

可变参数

可变参数指传入的参数是可变的,不同于默认参数,可变参数可以理解为传入一个list或tuple,具体的使用有两种方式

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 第一种 
def my_calc(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
#传入一个list
m = [1,2,3,4,5,6]
print(my_calc(m))
# 第二种
def my_calc1(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
# 直接将参数用逗号隔开,传进去
print(my_calc1(1,3,5,7,9))
# 接收一个list的写法
n = [2,4,6,8,10]
print(my_calc1(*n))

输出结果:

91
165
220

可以看出可变参数的写法有两种,一种是直接传入一个list,第二种是用*numbers 直接将参数传入,list 传入时用 *n传入。

关键字参数

关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。与java中传入一个map 集合类似,如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
    return
# 通过name = value 形式传入
person('张三', 35, weight=55,height = 175)
##直接传入一个dict
others = {'weight': 65,'height': 185}

person ('李四',45,**others)

输出结果:

name: 张三 age: 35 other: {'weight': 55, 'height': 175}
name: 李四 age: 45 other: {'weight': 65, 'height': 185}

最后**others传入的是others 的复制版本,others 的变化不会引起函数的变化。

命名关键字参数

命名关键字是与位置参数比较的,位置可以灵活,写法在位置参数前加一个可变参数*args 或者*,命名关键字参数也可以有默认参数,如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def person(name, age, *,  weight,heigth):
    print('name=',name, 'age=',age,'weight=', weight,'heigth=', heigth)

person('张三', 24, weight=55, heigth=175)

def person(name, age, *args,  weight,heigth):
    print('name=',name, 'age=',age,'weight=', weight,'heigth=', heigth,args)

person('张三', 24,weight=55, heigth=175,*(1,2,3,4))

输出结果:

name= 张三 age= 24 weight= 55 heigth= 175
name= 张三 age= 24 weight= 55 heigth= 175 (1, 2, 3)

组合参数

在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是他们是有顺序的跟运算符的级别一样。顺序如下:

  • 必选参数
  • 默认参数
  • 可变参数
  • 命名关键字参数
  • 关键字参数

要注意的是不要同时使用太多的组合,否则函数接口的可理解性很差。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

args = (1, 2, 3, 4,5)
kw = {'d': 99, 'x': '#'}
f1(*args, **kw)

输出结果:

a = 1 b = 2 c = 3 args = (4, 5) kw = {'d': 99, 'x': '#'}

不可思议吧,看到这个结果,对照组合参数的级别不难理解。参数到这就介绍完了,只有多实践才能深入理解。

递归函数

递归函数在各种语言中都有,python的递归有啥特点呢?廖雪峰大神专门一节讲解,我们就来看看吧。

递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
递归函数的缺点是递归太深的话,因为python没有尾递归优化会导致栈溢出。

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

#n! n的阶乘
def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)
print(fact(10))
print(fact(20))

输出结果:

3628800
2432902008176640000

参考

https://www.python.org
http://www.runoob.com/python3/python3-tutorial.html
https://www.liaoxuefeng.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • 本文为《爬着学Python》系列第十篇文章。 在实际操作中,可能函数是我们几乎唯一的实现操作的方式,这是因为函数能...
    SyPy阅读 5,443评论 0 8
  • Python 是一种相当高级的语言,通过 Python 解释器把符合语法的程序代码转换成 CPU 能够执行的机器码...
    Python程序媛阅读 1,888评论 0 3
  • 三年前的秋天,我从学校离开,进入幼儿园学习。 幼儿园就如这副图片一样,绿色的草地宛如不小心闯进了内蒙古的大草原,心...
    海上日落阅读 435评论 0 0
  • 这个时代布满了黑暗。 那些企图洗去历史丑恶,借以开启新时代的一批人,正在无情的压制着持反对意见的人。 街上人潮狂奔...
    骑士日记阅读 361评论 0 1
  • 文/ 谢友芝 图/网络(权侵删) 昆明又下雨了 灰暗的天空 刺骨...
    小小逗号阅读 128评论 0 0