Python初识函数

函数理论篇

什么是函数


  在编程语言中的函数不同于数学中的函数。不管是数学上的函数还是编程语言中的函数都是为了完成特定的某一功能而诞生的,他们的区别在于:

  1.数学中的函数当输入的值是固定的情况下那么输出的值也一定是固定的。它内部不允许原本输入的值状态发生改变。

  2.编程语言中的函数则可以允许传入的值进行修改的。如果按照数学函数的定义来做编程语言的函数,那么这种函数则被称为纯函数(pure function

  在Python中,函数主要有两类。一类是我们已经接触过的内置函数(如:print()open()id()...),而另一类则是我们将要学习的自定义函数。

  内置函数又被称为工厂函数,工厂函数是Python内部原本就定义好的函数只需要人们去调用即可,它的创建初衷是是对于大多数人来说都会使用上且重复使用频率较高的一些,并不需要人们再去重复的实现一次具体功能,而是直接调用Python写好的方法即可。

  而自定义函数则是在内置函数无法完成需求的情况下,由开发人员去自己创作的为了满足特定的某一项功能的可重复使用的具体代码集合。

为什么要有函数


  函数主要解决流式代码的两大问题:

  1. 代码冗余度高,程序的组织结构不清晰,可读性差

  2. 可维护性以及可扩展性差

  没有学习函数之前我们的所有代码都是以流式的方式写的。比如,我要在程序的一百处不同地方打印 hello,world 。那么按照流式的处理是没有较好的解决方案的只能一次一次的print(),这就造成了代码冗余度高的问题,而且重复代码越多代码可读性越差,为了解决这种问题所以诞生了函数,记住函数的一个特点,可重复调用(或者说使用)。

怎么使用函数


  函数使用和变量的使用都是一样的。即:先定义,后调用。但是内置函数除外,内置函数是Python内部帮你定义好的函数,直接使用即可。下面用一个简短的例子来看一下函数到底该怎么用。

# ==== 自定义函数 ====

"""
^ 代表可选
def 函数名(参数1^,参数2^..):  
"""功能描述"""^
逻辑体 ^
return 返回值 ^

函数名()
"""

def func():
print("hello,world") # 函数体

print(func) # 函数名就相当于变量名。存储了函数体代码的内存地址

func() # 函数调用
func()
func()
func()

# ==== 执行结果 ====

"""
<function func at 0x0000025AB9905040>
hello,world
hello,world
hello,world
hello,world
"""

定义函数时发生的事

  1.申请内存空间保存函数体代码

  2.将上述内存地址绑定给函数名

  3.定义函数并不会执行函数体内部代码,但是会检测函数体的语法

调用函数时发生的事

  1.通过函数名找到函数的内存地址。

  2.加上括号是一种语法格式,代表执行函数体内部代码

  3.创建函数栈帧(全局唯一)。

函数的定义

无参函数


  无参函数大多数情况下只是希望该函数单纯的做一点什么事情而并不需要该函数给返回一个结果。(函数可以理解为工厂,参数可以理解为原材料):

# ==== 无参函数的使用 ====

def printf(): # 函数名的命名与变量名相同。采用小写字母加下划线的形式
"""该函数只是单纯的做一段话的打印操作而已"""
print("您做的操作具有危险性!!!")

print("噼里啪啦逻辑1...")
printf() # 需要单纯的打印这句话
print("噼里啪啦逻辑2...")
printf() # 需要单纯的打印这句话
print("噼里啪啦逻辑3...")
printf() # 需要单纯的打印这句话

# ==== 执行结果 ====

"""
噼里啪啦逻辑1...
您做的操作具有危险性!!!
噼里啪啦逻辑2...
您做的操作具有危险性!!!
噼里啪啦逻辑3...
您做的操作具有危险性!!!
"""

有参函数


  有参函数是我们今后用到最多的函数,参数相当于原材料。函数体内部相当于一个工厂,通过逻辑我们可以将原材料加工成我们想要的数据。

# ==== 有参函数的使用 ====

def sub(x, y): # 接收原材料
"""该函数是执行一次减法操作"""
# 加工过程...
return x - y # 返回结果


res = sub(3, 2) # 原材料 res为接收结果
print(res)

# ==== 执行结果 ====

"""
1
"""

空函数


  空函数的应用场景也比较广泛。主要是在做代码逻辑构思时用的,如下:

# ==== 空函数的使用 ====

def download(url):
"""输入url进行下载"""
pass

def upload(file_path,url):
"""输入文件路径及url进行上传"""
pass

def preview(res):
"""当上传完成后自动执行该函数执行预览功能"""
pass # 注意:也可以使用 ... 来代替pass

函数的调用

语句形式


  语句形式即为只加括号调用函数。具体这里不再举例。

表达式形式


  表达式形式这里还是再举一下例子:

# ==== 表达式形式的函数调用 ====

def sub(x, y): # 接收原材料
"""该函数是执行一次减法操作"""
# 加工过程...
return x - y # 返回结果


# 赋值表达式
res = sub(3, 2) # 原材料 res为接收结果
print(res)

# 数学表达式
res = sub(10, 5) * 10 # sub函数返回结果是5,再 * 10 得出的变量值的内存地址交给变量名res
print(res)

# ==== 执行结果 ====

"""
1
50
"""

参数调用形式


  函数可以作为参数传递给其他函数:

# ==== 参数调用形式的调用函数 ====

def sub(x, y): # 第一次,10,5 第二次,5,3
"""该函数是执行一次减法操作"""
return x - y # 返回结果 第一次:5 第二次:2


res = sub(sub(10, 5), 3) # 再次传入 5 和 3
print(res)

# ==== 执行结果 ====

"""
2
"""

函数的返回值

默认返回值


  Python中的函数一定有返回值,如果不指定return,函数默认返回为None,代表空,什么都没有的意思。另外如果函数中存在循环。return也能用于跳出循环体并且跳出函数体代码。(不执行函数体return后的所有代码)

# ==== 函数的默认返回值 ====

def retrunTest():
print("没有指定返回值...")

res = retrunTest() # res用来接收返回值。注意Python的函数每一个都有返回值,默认返回为None
print("返回值是-->{}".format(res))

# ==== 执行结果 ====

"""
没有指定返回值...
返回值是-->None
"""

return 返回一个值


  如果指定返回值,则将返回值返回出去。(参数代表吃的东西,返回值代表拉的屎)。

# ==== 使用 return 返回一个值 ====

def retrunTest():
print("return指定一个返回值...")
return "屎"

res = retrunTest() # res用来接收返回值。
print("返回值是-->{}".format(res))

# ==== 执行结果 ====

"""
没有指定返回值...
返回值是-->屎
"""

return 返回多个值


# ==== 使用 return 返回多个值 ====

def retrunTest():
print("return指定多个返回值...")
return "屎","尿","恐怖的东西.."

res = retrunTest() # res用来接收返回值。
print("返回值是-->{}".format(res))
print("返回值的类型是-->{}".format(type(res)))


x,y,z = retrunTest() # 也可直接用解压赋值
print("x ---> {value}".format(value=x))
print("y ---> {value}".format(value=y))
print("z ---> {value}".format(value=z))

# ==== 执行结果 ====

"""
return指定多个返回值...
返回值是-->('屎', '尿', '恐怖的东西..')
返回值的类型是--><class 'tuple'>
return指定多个返回值...
x ---> 屎
y ---> 尿
z ---> 恐怖的东西..
"""

其他知识补充

函数的执行


  函数的使用方法是先定义后执行。在Python中函数的声明必须放在函数的调用前(JavaScript不一样),否则会抛出异常。

func() # 执行不了

def func():
print("执行")

函数的嵌套


  函数可以嵌套使用。看一下下面这个操作:

# 请记住,Python是解释性语言。解释一行执行一行,当碰见def关键字开头的语句
# 内部会检测一下该代码块的语法,如果没有出现问题则代表该函数定义好了。
# 只有碰到函数名加括号的情况下才会去执行该函数,在运行阶段没抛出异常,# 代表func2是被检测过语法的。
# 也就是说func2是被定义好了的,只需要等待调用即可。如果还不理解可以打断点进行debug

def func1(): #
print("执行func1") #
func2() # 看起来func2是在定义之前调用。实际上在执行func2的时候func2早已定义好了。 # 5


def func2(): #
print("执行func2") #

func1() # 3 #7


# ==== 执行结果 ====

"""
执行func1
执行func2
"""

Python初识函数的更多相关文章

  1. 万恶之源 - Python初识函数

    什么是函数 我们目前为止,已经可以完成一些软件的基本功能了,那么我们来完成这样一个功能:约x pint("拿出手机") print("打开陌陌") print( ...

  2. python 初识函数

    1.什么是函数 函数就是对一个代码块 或者功能的封装,什么时候用,什么时候执行 语法: def  函数名():            函数体(代码块) 函数的调用 函数名()          #所有 ...

  3. 2018.8.8 python 初识函数

    主要内容: 1.函数定义 2.函数名,函数体以及函数的调用 3.函数的返回值 4.函数的参数 一.函数的定义 函数:对代码块和功能的封装和定义. 二.函数名.函数体及函数的调用 我们使用def关键字来 ...

  4. python之路——初识函数

    阅读目录 为什么要用函数 函数的定义与调用 函数的返回值 函数的参数 本章小结 返回顶部 为什么要用函数 现在python届发生了一个大事件,len方法突然不能直接用了... 然后现在有一个需求,让你 ...

  5. python基础 (初识函数&函数进阶)

    函数基础部分 .什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...

  6. python基础之 初识函数&函数进阶

    函数基础部分 1.什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...

  7. 孤荷凌寒自学python第十七天初识Python的函数

    孤荷凌寒自学python第十七天初识Python的函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 函数是能够完成指定运算并返回运算结果的代码块.是结构化编程重要的结构. 我首先发现pyt ...

  8. 9.Python初窥门径(函数初识)

    Python(函数初识) 一.初识函数 面向过程缺点 : 代码重复,代码描述性不高 函数 : 函数是以功能为导向,一个函数封装一个功能. 函数的优点 : 减少代码重复性,增强了代码的可读性 二.函数的 ...

  9. Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数

    Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数 内容大纲 1.函数的初识 2.函数的定义 3.函数的调用 4.函数的返回值 5.函数的参数 1.函数初识 # def ...

随机推荐

  1. 【译】Welcome to C# 9.0

    C# 9.0正在形成,我想分享我们对添加到该语言下个版本的一些主要功能的看法.对于每个新版本的 C#,我们努力使常见的编码方案更加清晰和简单,C# 9.0 也不例外.这次的一个特别重点是支持数据形状的 ...

  2. 初学者对Git的使用安装教程,以及对unknown key type -rsa的解决办法

    第一次使用Git,诚惶诚恐. Git在每个电脑上第一次使用必须要配置环境,才能通过SSH秘钥的方式安全稳定的拉取代码! 此文适合对Git一无所知的小白观看,大神勿扰.下面我将讲解一个傻瓜式的Git安装 ...

  3. (Java实现) 洛谷 P1200 你的飞碟在这儿

    题目描述 众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者.不幸的是,他们的飞碟每次出行都只能带上一组支持者.因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走 ...

  4. Java实现 LeetCode 122 买卖股票的最佳时机 II

    122. 买卖股票的最佳时机 II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意: ...

  5. java实现最大连续和问题

    /* 10 5 -3 12 -31 15 22 -7 6 -8 -9 10 .... 暴力:O(n^3) 分治:[ mid ) 三种情况求最大 基线法: O(n) 2个数组: 从左到本位:出现的最大累 ...

  6. let与var的一个重要区别

    我们先来看下面这一段代码 html代码 <ul> <li>sdfsdagsdgsa</li> <li>sdfsdagsdgsa</li> & ...

  7. c#撸的控制台版2048小游戏

    1.分析 最近心血来潮,突然想写一个2048小游戏.于是搜索了一个在线2048玩玩,熟悉熟悉规则. 只谈核心规则:(以左移为例) 1.1合并 以行为单位,忽略0位,每列依次向左进行合并,且每列只能合并 ...

  8. 前端JS的服务订阅&服务发布

    var eventCenter = { sub:function(mesName, mesCallback){ this.argus=this.argus||{}; this.argus[mesNam ...

  9. laravel clone后需要做的操作

    首先 安装依赖关系 composer install 第二步 复制配置文件 cp .env.example .env 第三步 创建新的应用程序密钥 php artisan key:generate 第 ...

  10. rsyslog日志收集器

    rsyslog详解(思维导图) 1. 日志收集概述 1.1 日志记录 时间 事件 1.2 日志收集器 syslog rsyslog elk stack 1.3 日志文件 文件记录的日志格式 其他日志文 ...