【Python基础】Python 函数使用总结
我的施工之路
目前已完成,以下五期Python专题总结:
1我的施工计划
2数字专题
3字符串专题
4列表专题
5流程控制专题
6编程风格专题
今天是Python函数专题,目录结构:
Python 函数专题
基础部分
1 函数组成
2 引用传参
3 默认参数与关键字参数
4 可变参数
5 内置函数
进阶部分
6 偏函数
7 递归函数
8 匿名函数
9 高阶函数
10 嵌套函数
总结
Python 函数专题
函数是一个接受输入、进行特定计算并产生输出的语句集。
我们把一些经常或反复被使用的任务放在一起,创建一个函数,而不是为不同的输入反复编写相同的代码。
Python提供了print
、sorted
、max
、map
等内置函数,但我们也可以创建自己的函数,称为用户定义函数。
基础部分
1 函数组成
如下自定义函数:
def foo(nums):""" 返回偶数序列"""evens = []for num in nums:if num%2==0:evens.append(num)return evens
可以看到函数主要组成部分:
函数名:
foo
函数形参:
nums
:
: 函数体的控制字符,作用类似Java
或C++
的一对{}
缩进:一般为4个字符
"""
:为函数添加注释return
: 函数返回值
以上函数求出列表nums
中的所有偶数并返回,通过它了解Python函数的主要组成部分。
2 引用传参
定义好一个函数后,使用:函数名+()+实参,调用函数,如下方法:
foo([10,2,5,4])
其中[10,2,5,4]
为实参,它通过by reference
方式传给形参nums
,即nums
指向列表头,而不是重新复制一个列表给nums
.
再看一个引用的例子:
def myFun(x): x[0] = 20
如下调用:
lst = [10, 11, 12, 13, 14, 15]
myFun(lst)
实参lst
和形参x
都指向同一个列表:
因此,对x[0]
修改实际就是对实参lst
的修改,结果如下:
但是,有时在函数内部形参指向改变,因此实参与形参的指向分离,如下例子:
def myFun(x): x = [20, 30, 40]x[0] = 0
调用:
lst = [10, 11, 12, 13, 14, 15]
myFun(lst)
x
被传参后初始指向lst
,如下所示:
但是,执行x = [20, 30, 40]
后,对象x
重新指向一个新的列表对象[20,30,40]
:
因此,对于x
内元素的任何修改,都不会同时影响到lst
,因为指向已经分离。
3 默认参数与关键字参数
Python函数的参数,可以有初始默认值,在调用时如果不赋值,则取值为默认值,如下例子:
def foo(length,width,height=1.0):return length*width*height
调用foo
函数,没有为height
传参,所以取为默认值1.0
:
r = foo(1.2,2.0)
print(r) # 2.4
使用默认值有一点需要区分,有的朋友会与关键字参数混淆,因为它们都是para=value
的结构,但是有一个很明显的不同:默认值是声明在函数定义时,关键字参数是在函数调用时使用的此结构。如下例子:
def foo(length,width,height=1.0): # height是默认参数return length*width*heightfoo(width=2.0,length=1.2) #确定这种调用后才确定width和length是关键字参数
确定以上调用后,才确定width
和length
是关键字参数,并且关键字参数不必按照形参表的顺序调用。
4 可变参数
Java
和C++
在解决同一个函数但参数个数不同时,会使用函数重载的方法。Python使用可变参数的方法,非常灵活。
可变参数是指形参前带有*
的变量,如下所示:
def foo(length,*others):s = lengthfor para in others:s *= parareturn s
我们可以像下面这样方便的调用:
foo(1.2,2.0,1.0) # 2.4
如上,带一个星号的参数被传参后,实际被解释为元组对象
。我们还可以这样调用:
foo(1.2) # 1.2
5 内置函数
总结完函数的参数后,再举几个Python内置的常用函数。
pow
大部分朋友应该知道pow
是个幂次函数,比如求:
pow(2,3)
除此以外,pow
还有第三个参数,使用更高效的算法实现求幂后再求余数:
pow(2,3,5) # 3
max,min
max,min用来求解最大最小值,实现relu
函数:
def relu(x):return max(x,0)
sorted
sorted函数完成对象排序,它能接收一个指定排序规则的函数,完成定制排序。如下,根据字典值绝对值从小到大排序:
d = {'a':0,'b':-2,'c':1}
dr = sorted(d.items(),key=lambda x:abs(x[1]))
print(dr) # [('a', 0), ('c', 1), ('b', -2)]
进阶部分
Python有一个专门操作函数的模块:functools
,能实现一些关于函数的特殊操作。
6 偏函数
偏函数固定函数的某些参数后,重新生成一个新的函数。
通常用法,当函数的参数个数太多,需要简化时,使用partial
创建一个新的函数。
假设我们要经常调用int
函数转换二进制字符,设置参数base
为2:
int('1010',base=2)
为了避免每次都写一个参数base,我们重新定义一个函数:
def int2(s):return int(s,base=2)
以后每次转化字符串时,只需int2('1010
)即可,更加简便。
偏函数也能实现上述功能:
from functools import partialintp = partial(int,base=2)
那么有的朋友会问,偏函数就是个鸡肋,重新定义的int2
更加直观容易理解,这个角度讲确实是这样。但是int2
不能再接收base
参数,但是intp
函数还是能接收base
参数,依然保留了原来的参数:
intp('10',base=16) # 16
可能看到这里的读者还是有些迷糊,不太确定怎么使用偏函数。可以先记住:修改内置函数的默认参数,就像内置函数int
默认参数base等于10,使用偏函数调整默认base值为2.
7 递归函数
递归函数是指调用自身的函数。如下使用递归反转字符串:
def reverseStr(s): if not s:return s return reverseStr(s[1:])+s[0]print(reverseStr('nohtyp')) # python
reverseStr
函数里面又调用了函数reverseStr
,所以它是递归函数。
使用递归函数需要注意找到正确的递归基,防止陷入无限递归。
更多使用递归的例子大家可参考此公众号之前推送。
8 匿名函数
匿名函数是指使用lambda
关键字创建的函数。它的标准结构如下:
lambda 形参列表: 含有形参列表的表达式
表达式的计算值即为lambda
函数的返回值。
如下lambda
函数:
lambda x,y: x+y
它等价于下面的f
函数:
def f(x,y):return x+y
lambda函数常做为max
,sorted
,map
,filter
等函数的key参数。
9 高阶函数
可以用来接收另一个函数作为参数的函数叫做高阶函数。
如下f
有一个参数g
,而g
又是函数,所以f
是高阶函数:
def f(g):g()
Python 中经常会遇到高阶函数,今天介绍几个内置的常用的高阶函数。
map
map 函数第一个参数为函数,它作用于列表中每个的元素。
如下,列表中的单词未按照首字母大写其他字符小写的规则,使用map
一一capitalize
每个元素:
m = map(lambda s: s.capitalize(), ['python','Very','BEAUTIFUL'])
print(list(m))
结果:
['Python', 'Very', 'Beautiful']
reduce
reduce 高阶函数实现化简列表,它实现的效果如下:
如下例子,函数f
等于x+y
,求得两数之和,然后再与第三个数相加,依次下去,直到列表尾部,进而得到整个列表的和:
from functools import reduce def f(x,y):return x+yr = reduce(f, [1,3,2,4])
print(r) # 10
以上reduce
求解过程等于:
需要注意:reduce
函数要求f
必须带2个参数,只有这样才能完成归约化简。
10 嵌套函数
嵌套函数是指里面再嵌套函数的函数。
如下例子,将列表转化为二叉树。已知列表nums
,
nums = [3,9,20,None,None,15,7],转化为下面二叉树:
二叉树定义:
class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = None
构建满足以上结构的二叉树,可以观察到:树的父节点和左右子节点的关系:
基于以上公式,再使用递归构建二叉树。
递归基情况:
if index >= len(nums) or nums[index] is None:return None
递归方程:
根据以上分析,得到如下代码,list_to_binarytree
函数是嵌套函数,它里面还有一个level
子函数:
def list_to_binarytree(nums):def level(index):if index >= len(nums) or nums[index] is None:return Noneroot = TreeNode(nums[index])root.left = level(2 * index + 1)root.right = level(2 * index + 2)return rootreturn level(0)binary_tree = list_to_binarytree([3,9,20,None,None,15,7])
通常使用嵌套函数的场景:实现一个功能只需要编写2个函数,写成一个class
好像显得有些不必要,写成嵌套后更简洁,并且某些参数能共享,亲和性会更好。不妨体会上面的nums
参数。
总结
函数专题主要总结了以下:
Python 函数专题
基础部分
1 函数组成
2 引用传参
3 默认参数与关键字参数
4 可变参数
5 内置函数
进阶部分
6 偏函数
7 递归函数
8 匿名函数
9 高阶函数
10 嵌套函数
总结
《end》
往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群请扫码进群:
【Python基础】Python 函数使用总结相关推荐
- python的用途实例-Python基础之函数原理与应用实例详解
本文实例讲述了Python基础之函数原理与应用.分享给大家供大家参考,具体如下: 目标 函数的快速体验 函数的基本使用 函数的参数 函数的返回值 函数的嵌套调用 在模块中定义函数 01. 函数的快速体 ...
- Python基础之函数
详情请戳 python基础之函数介绍及使用 python基础之内置函数 python基础之迭代器和生成器 python基础之装饰器 转载于:https://www.cnblogs.com/zhangl ...
- Python数据结构与算法(1.5)——Python基础之函数与异常
Python数据结构与算法(1.5)--Python基础之函数与异常 0. 学习目标 1. 函数 1.1 自定义函数 1.2 函数与参数 1.3 函数与返回值 2. 异常处理 2.1 raise 语句 ...
- python基础 python函数 函数概念 函数的多种参数 多种调用参数 装包 解包 函数代码块 函数的返回值
python基础 python函数 函数概念 函数的多种参数 多种调用参数 装包 解包 函数代码块 函数的返回值 一 .函数概念 函数是根据需要,将代码打包为代码块, 每一个代码块就可以封装为一个函数 ...
- Python基础-Python基础使用
Python基础-Python基础使用 1.Python解释器 在Python文件的开头加入以下代码就制定了解释器. #!/usr/bin/env python # _*_ coding:utf-8 ...
- 刻意练习:Python基础 -- Task05. 函数与Lambda表达式
背景 我们准备利用17天时间,将 "Python基础的刻意练习" 分为如下任务: Task01:变量.运算符与数据类型(1day) Task02:条件与循环(1day) Task0 ...
- Python基础__函数
本节将进入函数的介绍,函数是Python基础中最精彩的部分之一,接下来将对函数做详细介绍. 函数 函数就是对代码进行一个封装.把实现某一功能的代码进行封装到一起.下次需要使用时不需要进行编写代码直接调 ...
- Python基础知识——函数的基本使用、函数的参数、名称空间与作用域、函数对象与闭包、 装饰器、迭代器、生成器与yield、函数递归、面向过程与函数式(map、reduce、filter)
文章目录 1 函数的基本使用 一 引入 二 定义函数 三 调用函数与函数返回值 2 函数的参数 一 形参与实参介绍 二 形参与实参的具体使用 2.1 位置参数 2.2 关键字参数 2.3 默认参数 2 ...
- 『Python基础』函数
Python中的函数 函数 (1)什么是函数? 软件开发,是为了解决生活中的问题,函数就是生活中的一种行为,如:吃饭.睡觉.学习.游戏等等等- 不需要资源.不需要结果.执行即可 关门的行为 需要资源. ...
- 第七篇 python基础之函数,递归,内置函数
阅读目录 一 数学定义的函数与python中的函数 二 为何使用函数 背景提要 三 函数和过程 四 函数参数 五 局部变量和全局变量 六 前向引用之'函数即变量' 七 嵌套函数和作用域 八 递归调用 ...
最新文章
- 4.Ling初体验 匿名类型在查询表达式中的使用
- Spring Security 实战干货: RBAC权限控制概念的理解
- Enable-Migrations出错
- python抽奖游戏大全_抽奖游戏
- 读书几年收藏的编程利器网站,给大家分享出来
- Linux系统安全工具tcpdump用法
- 恢复快速启动栏里的“显示桌面”图标
- Go中数字转换字符串的正确姿势
- leetcode--57--Insert Interval
- java内部类简单解析
- salesforce 零基础学习(三十二)通过Streams和DOM方式读写XML
- 《C#高级编程(第六版)》泛型学习笔记(一):泛型优点和特性 (转载)
- 常见的Markdownpad2运行破解以及This view has crashed!报错和Awesomium1.6.6SDK安装使用
- PS抠发丝简单详细方法
- 如何将文件自动一传到服务器,Windows文件传输篇:怎么上传文件到服务器?
- 微擎-人人商城接入Facebook授权登录
- 那些年,我们一起玩过的儿童游戏
- PATA1034题解
- ubuntu系统损坏修复_修复损坏的ubuntu gui
- SQL SERVER 软件和安装步骤
热门文章
- quartz数据库方式与web工程整合
- spring -boot定时任务 quartz 基于 MethodInvokingJobDetailFactoryBean 实现
- UOJ#310.【UNR #2】黎明前的巧克力(FWT)
- Github使用初体验2018.08.07
- POJ2142-The Balance【扩欧】
- 【java/C# 服务器】IOS 配置推送证书 p12文件流程 - 勿以己悲
- DirectShow学习
- WEB页面多语言支持解决方案(转自CSDN)
- android手机短信拦截器,垃圾短信退订套路深 手机上装拦截软件是可行方法
- 单细胞数据库PanglaoDB使用指南