python第三章:函数
在前面章节中,介绍了一些input(),print(),len()等内建函数,还有random,math等标准库相关函数,这些都是可以直接使用的,但是很多时候,我们也是可以编写自己的函数。
看个例子:
解析:def是函数关键字,hello是函数名,小括号里可以有0个或者多个参数,用逗号隔开
这个函数就是输出hello world,如果只是写了这个函数,是没法正常使用的,需要在外部进行函数调用,调用方式也就是函数名加参数的方式
函数基本结构:
声明函数的目的:
1.需要重复执行的内容放在一个函数里,这样可以节省代码量,只要外部调用就可以无限使用。
2.代码的整体简洁性,把一个功能块放在一个函数里,加上注释,可读性提高。
1.def语句和参数
定义一个带有参数的函数
结果:
解析,定义一个hello函数,接收两个参数,name和age,在正常调用的时候,
需要使用hello('参数1','参数2'),这里要注意参数的数据类型需要对应好,如果这里的age值传整型10,而不是字符串10就会报错,因为函数代码块打印的整体是一个字符串,不能拼接一个其他类型的数据,但是也可以通过强制数据类型转换解决。(使用int()函数)
另外,参数个数和顺序也是要对应准确
2.返回值和return语句
在实际的编码过程中,函数体内除了会执行必要的代码逻辑,也需要提供返回值来作为其他代码必要的条件,比如之前章节提到过的内建函数len(),如果加一个字符串‘hello’,就会返回这个参数的长度5。
return的结构:
下面举一个例子:
结果:
解析:定义了一个函数chooseFruit(),参数fruit,当调用函数时,传入的参数是apple,经过条件代码块返回苹果味道好极了存入变量spam中,最后通过print()函数打印出来,最后代码块也可以写成
print(chooseFruit('apple')),效果是一样的。
3.None值
None表示没有值,和True、False一样,首字母大写,类似java里的null。
结果:
解析:不同于len()和input()函数,print()函数没有返回值,对于这些函数,python都会默认给这些函数返回None
4.关键字参数和print()
4.1:在有些场景中,我们连续打印两个字符串,比如:
结果:hello world被分在了两行,原因是print函数默认会在当前打印结果后添加换行符
但是存在一些常用关键字,可以改变内容的展示方式
end关键字:改变文本后的拼接方式
结果:在第一个打印的字符串后面,替换了原来的换行符,变成了一个空格
4.2:还有一种场景,需要同时打印出多个字符串
结果:输出的内容默认由空格分隔
sep关键字:改变文本间的拼接方式
结果:字符串之间替换了原来的空格,变成了逗号分隔
除了这些外,还有一些函数有指定的关键字可以选择。
5.局部和全局作用域
概念:在一个程序里,通常就只有一个全局作用域,但是有多个局部作用域。全局作用域下声明的变量叫做全局变量,局部作用域下的变量叫做局部变量。全局作用域开始于程序开始,终止于程序结束,局部作用域开始于函数被调用时,终止于函数返回结果时(对于没有return的函数,默认返回None)。
作用域是一个比较重要的概念,需要理解以下几点:
另外,在实际使用中,需要根据特定情况去使用局部变量还是全局变量
5.1:全局作用域不能使用局部变量
结果:变量错误,age在全局作用域中未定义,只是在hello()函数内定义,属于局部变量
5.2:局部作用域可以访问全局变量
结果:输出10
解析:定义全局变量10,函数hello()返回全局变量,通过print打印,正常输出结果10。
5.3:不同函数间的局部作用域没有任何关联
例1:
结果:
解析:虽然在man()函数中调用了woman()函数,但是woman()函数里的age和name的值并没有传递过来,最终打印结果还是man()里的参数值
例2:
结果:
解析:去除了man()函数中声明的age变量,虽然man()函数中调用了woman()函数,但是age局部变量并没有传递,导致man()打印age报错
5.4:不同作用域可以使用相同的变量名
在5.3例子中就展示了不同的局部作用域下可以使用相同的变量名,那在全局作用域和局部作用域里是否可以呢?
结果:
解析:第一个直接打印全局变量name值为dingy,然后调用sapm()函数,函数里同样是定义了一个name变量,打印出chengjq,最后在全局作用域下再打印name,还是全局变量的值dingy,说明不同的作用域下可以定义相同的变量名,但是值互不影响
但是如何局部变量如果影响全部变量的值呢
最后在全局变量里打印的就是局部变量的值,其实中间只是重新赋值
6.global语句
global用来表示变量就是全局变量,无论在局部作用域下还是全局作用域下 ,他都是全局变量
结果:
解析:如果没有global name,最后输出dingy,但是name声明为全局变量后,他的作用域就是全局作用域。
还有一点要注意:
比如这个例子:结果打印出 chengjq
解析:如果函数内的变量没有声明global 也没有赋值语句,该变量也是全局变量
如果在spam函数代码块后面加上name的赋值语句
结果:
解析:意思就是python编译器看到spam()函数里有变量name的赋值语句,就认为name是局部变量,但是一开始打印print(name),此时的name还未定义,错误就是指:打印的变量在声明之前报错
7.异常处理
在之前的代码中,已经遇到了很多的错误情况,但是有时候不希望错误情况影响程序的正常运行,可以使用try except代码块来处理
比如上面一个例子做一下修改:把报错的print(name)放在try except代码块里
结果:输出程序bug
解析:try里是程序正常执行的业务逻辑,当try里的代码遇到错误时,会被except给拦截,走except里的代码块,Exception是包含了所有的异常情况,有些时候只需要拦截特定的异常,比如除数不为0的异常:ZeroDivisionError
python第三章:函数的更多相关文章
- 简学Python第三章__函数式编程、递归、内置函数
#cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...
- python的三个函数(eval、exec、complie)和python版RMI
一.python的三个函数: 1.eval函数: 之前已经讲过了这个函数,该函数也类似于php的eval,例如下边这个例子 eval("os.system('id')") 但是有个 ...
- Python第六章-函数01-函数的概念和使用
函数 为了便于程序的维护和更好的实现模块化,好的程序都会分解为很多函数. 可以这么说,对于任何的编程语言,函数都是一个非常重要的概念. python 不仅简化了函数的定义过程,而且还大量借鉴了其他函数 ...
- Python第六章-函数02-函数的作用域
函数 三.作用域规则 有了函数之后,我们必须要面对一个作用域的问题. 比如:你现在访问一个变量,那么 python 解析器是怎么查找到这个变量,并读取到这个变量的值的呢? 依靠的就是作用域规则! 3. ...
- Python第六章-函数06-高阶函数
函数的高级应用 二.高阶函数 高级函数, 英文叫 Higher-order Function. 那么什么是高阶函数呢? 在说明什么是=高阶函数之前, 我们需要对函数再做进一步的理解! 2.1 函数的本 ...
- Python第三章-字符串
第三章 字符串 3.1 基本字符串操作 Python的字符串和元组差不多,是不可以进行改变的,如果想改变值,可以尝试list序列化之后在进行修改. { website = 'http://ww ...
- Python笔记·第九章—— 函数 (一)
一.函数的作用 函数可以让我们代码结构更清晰,而且避免了代码的重复,冗余,使一段代码或者功能可以反复的被调用,大大提高了开发效率 二.函数的定义 def 函数名(参数1,参数2,*args,默认参数, ...
- Python第三周 函数详解
def 函数名(): """注释说明"""" 执行逻辑体 return 返回值 定义不带参数的函数 带参数的函数 默认参数 这个是 ...
- Python之旅.第三章.函数4.01/4.02
一.三元表达式 #普通的判断大小函数def max2(x,y): if x > y: return x else: return yres=max2(10,11)print(res)x=12y= ...
随机推荐
- Kubernetes K8S之Service服务详解与示例
K8S之Service概述与代理说明,并详解所有的service服务类型与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master Cent ...
- mysql之慢日志查询
转自https://my.oschina.net/wuweixiang/blog/2987434 首先得配置my.cnf: #===================================== ...
- 《Java核心技术卷一》之 泛型
一.引言 在学习集合的时候我们会发现一个问题,将一个对象丢到集合中后,集合并不记住对象的类型,统统都当做Object处理,这样我们取出来再使用时就得强制转换类型,导致代码臃肿,而且加入集合时都是以Ob ...
- Vue常用指令详解分析
Vue入门 Vue是一个MVVM(Model / View / ViewModel)的前端框架,相对于Angular来说简单.易学上手快,近两年也也别流行,发展速度较快,已经超越Angular了.比较 ...
- Linux安装软件方法总结
相比于windows系统,Linux安装程序就比较复杂了,很多需要root用户才能安装.常见的有以下几种安装方法 源码安装 rpm包安装 yum安装 (RedHat.CentOS) apt-get安装 ...
- ThinkPHP 5 生命周期
前段时间用TP5开发了一个小程序,就熟悉了一下TP5.TP5是TP框架最新的一个版本,与以前的3还是有很大的区别,有人说和laravel比较靠近,其实也还好,每个人都有自己不同的看法,只要是选择一个自 ...
- Linux系统编程 —时序竞态
时序竞态 什么是时序竞态?将同一个程序执行两次,正常情况下,前后两次执行得到的结果应该是一样的.但由于系统资源竞争的原因,前后两次执行的结果有可能得到不一样的结果,这个现象就是时序竞态. pause函 ...
- LRC 滚动器 + Vue.js
LRC 滚动展示VueJS cnblogs @ Orcim 最 近一直在学习尤大大的这个前端框架.Vue 无疑是一款极易上手的前端框架,因为官方的文档就是中文的,十分"本土化", ...
- Lyndon words学习笔记
Lyndon words 定义: 对于一个字符串\(S\),若\(S\)的最小后缀是其本身,则\(S\)为一个\(lyndon\)串; 记为\(S\in L\); 即: \[S \in L \begi ...
- matlab中exist 检查变量、脚本、函数、文件夹或类的存在情况
参考: 1.https://ww2.mathworks.cn/help/matlab/ref/exist.html?searchHighlight=exist&s_tid=doc_srchti ...