A、函数的基本使用
1.函数的定义
函数是一段具有特定功能的、可重用的语句组,用函数名来表示,并通过函数名进行功能调用。
函数也可以看作是一段具有名字的子程序,可以在需要的地方调用执行,不需要在每个执行地方重复编写这些语句。
每次使用函数可以提供不同的参数作为输入,以实现对不同数据的处理。
函数执行后,还可以反馈相应的处理结果。
函数是一种功能抽象(类似黑盒)。
使用函数的目的:
降低编程难度
代码重用
函数的使用:
函数定义
Python安装包自带的函数:
Python内置函数(abs()、eval()、input())
Python标准库中的函数(math.sqrt())
自定义函数(用户自己编写)
函数调用
自定义函数
Python定义一个函数使用def保留字:
自定义函数
函数定义时,所指定的参数是一种占位符
函数定义后,如果不经过调用,不会被执行
函数定义时,参数是输入,函数体是处理,结果是输出(IPO)
函数名:任何有效的Python标识符
参数列表:调用函数时给它的值
参数个数>=0
多个参数用 , 分隔
形式参数(形参):定义函数时使用,只在函数内部有用。
实际参数(实参):调用函数时使用。可以是常量、变量、表达式、函数。
函数体:函数被调用时执行的代码
return语句:
结束函数调用,并将结果返回给调用者
可选
可以出现在函数体的任意位置
如果没有return语句,函数在函数体结束位置将控制权返回给调用方
函数接口:返回值和参数
函数传递信息的途径:
通过函数返回值的方式传递信息
通过参数传递信息
实例:生日歌
过生日时要为朋友唱生日歌,歌词为:
Happy birthday to you!
Happy birthday to you!
Happy birthday, dear
Happy birthday to you!
要求:编写程序为Mike和Lily输出生日歌。
最简单的实现方法是重复使用print()语句。
生日歌
2.函数调用的过程
程序调用一个函数需要执行以下四个步骤:
(1)调用程序在调用处暂停执行;
(2)在调用时,将实参复制给函数的形参;
(3)执行函数体语句;
(4)函数调用结束给出返回值(return),程序回到调用前的暂停处继续执行。
3.lambda函数
Python有33个保留字,其中一个是lambda,用于定义一种特殊的函数 — 匿名函数,又称lambda函数。
匿名函数并非没有名字,而是将函数名作为函数结果返回,如下:
=
lambda :
lambda函数与正常函数一样,等价于下面形式:
def ():
return
简单说,lambda函数用于定义简单的、能够在一行内表示的函数,返回一个函数类型。
举例
谨慎使用lambda函数
lambda函数主要用作一些特定函数或方法的参数
lambda函数有一些固定的使用方式,建议逐步掌握
一般情况下,建议使用def定义普通函数
B、函数的参数传递
1.函数的参数
函数的形参、实参。
函数可以定义可选参数,使用参数的位置或者名称传递参数值。
根据函数中变量的不同作用域有不同的函数返回值方式。
2.可选参数和可变数量参数
在定义函数时,有些参数可以存在默认值
参数可以存在默认值
在函数定义时,可以设计可变数量参数
通过参数前增加星号(*)实现
必须放在参数列表的最后
调用时,这些参数被当做元组类型传递到函数
举例
3. 参数的位置和名称传递
函数调用时,默认将实参按照位置顺序传递给函数
例如:func(x1,y1,z1,x2,y2,z2)
return
实际调用:result=func(1,2,3,4,5,6)
可读性差
提供了按照形参名称输入实参的方式,调用如下:
result=func(x2=4, y2=5, z2=6, x1=1, y1=2,z1=3)
由于调用函数时指定了参数名称,所以参数之间的顺序可以任意调整。
4. 函数的返回值
return语句用来退出函数,并将程序返回到函数被调用的位置继续执行。
return语句同时可以将0个、1个或多个函数运算完的结果返回给函数被调用处的变量,例如:
返回值
函数可以没有return,此时函数并不返回值,等价于return none。
没有return
举例
用return返回多个值,也可以根据多返回值的顺序进行赋值。
return返回多个值
举例
返回值可以是一个变量,也可以是一个表达式
表达式
5. 函数对变量的作用
函数通过参数与调用程序传递信息。
函数的形参值接收了实参的值,给形参赋值不影响实参。
Python通过值来传递参数。
一个程序中的变量包括两类:
局部变量指在函数内部使用的变量,仅在函数内部有效,当函数退出时变量将不存在。
全局变量指在函数之外定义的变量,一般没有缩进,在程序执行全过程有效。
全局变量
原因:当函数执行完退出后,其内部变量将被释放。
如果函数内部使用了全局变量呢?
局部变量
函数func()内部使用了变量n,并且将变量参数b赋值给变量n,为何全局变量n值没有改变?
如果希望让func()函数将n当作全局变量,需要在变量n使用前显式声明该变量为全局变量。
全局变量
如果全局变量不是整数n,而是列表类型ls,会怎么样呢?
列表类型ls
如果func()函数内部存在一个真实创建过且名称为ls的列表,则func()将操作该列表而不会修改全局变量。
ls的列表是否改变
Python函数对变量的作用遵守如下原则:
简单数据类型变量无论是否与全局变量重名,仅在函数内部创建和使用,函数退出后变量被释放;
简单数据类型变量在用global保留字声明后,作为全局变量;
对于组合数据类型的全局变量,如果在函数内部没有被真实创建的同名变量,则函数内部可直接使用并修改全局变量的值;
如果函数内部真实创建了组合数据类型变量,无论是否有同名全局变量,函数仅对局部变量进行操作。
C、datetime库的使用
引入模块
from datetime import datetime
1.datetime库概述
以不同格式显示日期和时间是程序中最常用到的功能。
Python提供了一个处理时间的标准函数库datetime,它提供了一系列由简单到复杂的时间处理方法。datetime库可以从系统中获得时间,并以用户选择的格式输出。
datetime库亿格林威治时间为基础。
每天划分为3600×24秒。
两个常量:datetime.MINYEAR(=1) 和datetime.MAXYEAR (=9999)。
datetime库以类的方式提供多种日期和时间表达方式
datetime.date:日期表示类,表示年、月、日等
datetime.time:时间表示类,表示小时、分钟、秒、毫秒等
datetime.datetime:日期和时间表示的类,功能覆盖date和time类
datetime.timedelta:时间间隔有关的类
datetime.tzinfo:与时区有关的信息表示类
2.datetime库解析
使用datetime.now()获得当前日期和时间对象
作用:返回一个datetime类型,表示当前的日期和时间,精确到微秒。
例子
使用datetime.utcnow()获得当前日期和时间对应的UTC(世界标准时间)时间对象,使用方法如下:
datetime.utcnow()
作用:返回datetime类型,表示当前日期和时间的UTC表示,精确到微秒。
例子
datetime.now()和datetime.utcnow()都返回一个datetime类型的对象,也可以直接使用datetime()构造一个日期和时间对象,使用方法如下:
datetime(year, month, day, hour=0,
minute=0,second=0, microsecond=0)
作用:返回一个datetime类型,表示指定的日期和时间,可以精确到微秒。
调用datetime()函数直接创建一个datetime对象,表示2018年4月16日22:33,32秒7微秒,执行结果如下:
例子
程序已经有了一个datetime对象,进一步可以利用这个对象的属性显示时间,为了区别datetime库名,采用上例中的someday代替生成的datetime对象
方法
datetime对象有3个常用的时间格式化方法,如表所示:
方法
isoformat()和isoweekday()方法的使用如下:
举例
strftime()方法是时间格式化最有效的方法,几乎可以以任何通用格式输出时间
方法
strftime()格式化字符串的数字左侧会自动补零,上述格式也可以与print()的格式化函数一起使用
举例
D、七段数码管绘制
1.七段数码管绘制
七段数码管(seven-segment indicator)由7段数码管拼接而成,每段有亮或不亮两种情况,改进型的七段数码管还包括一个小数点位置。
七段数码管
七段数码管能形成27=128种不同状态,其中部分状态能够显示易于人们理解的数字或字母含义,因此被广泛使用。下图给出了十六进制中16个字符的七段数码管表示。
16个字符的七段数码管表示
要求:
用程序绘制七段数码管。
用程序绘制七段数码管
基本思路:
绘制单个数字对应的数码管
获得一串数字,绘制对应的数码管
获得当前系统时间,绘制对应的数码管
每个0到9的数字都有相同的七段数码管样式,因此,可以通过设计函数复用数字的绘制过程。
进一步,每个七段数码管包括7个数码管样式,除了数码管位置不同外,绘制风格一致,也可以通过函数复用单个数码段的绘制过程。
步骤1:绘制单个数字对应的数码管
七段数码管有7个基本线条组成
七段数码管可以有固定顺序
不同数字显示不同的线条
E、代码的复用和模块化设计
1.代码的复用
把代码当做资源进行抽象
代码资源化:程序代码是一种用来表达计算的“资源”。
代码抽象化:使用函数等方法对代码赋予更高级别的定义。
代码复用:同一份代码在需要的时候可以被重复使用 –– 首先要对代码进行抽象
函数和对象是代码复用的两种主要形式
函数:将代码命名在代码层面建立了初步的抽象。
对象:属性和方法
在函数之上再次组织进行抽象
函数是程序的一种基本抽象方式,它将一系列代码组织起来通过命名供其他程序使用。
函数封装的直接好处是代码复用,任何其他代码只要输入参数即可调用函数,从而避免相同功能代码在被调用处重复编写。
代码复用产生了另一个好处,当更新函数功能时,所有被调用处的功能都被更新(更新便利)。
当程序的长度在百行以上,如果不划分模块,就算是最好的程序员也很难理解程序含义,程序的可读性就已经很糟糕了。
最好解决方法:将一个程序分割成短小的程序段,每一段程序完成一个小的功能。
无论面向过程和面向对象编程,对程序合理划分功能模块并基于模块设计程序是一种常用方法,被称为“模块化设计”。
2. 模块化设计
模块化设计的核心:分而治之
通过函数或者对象封装,将程序划分为模块和模块之间的表达
具体包括:主程序、子程序和子程序间关系
子程序:模块
主程序:模块间的关系
分而治之:一种分而治之、分层抽象、体系化的设计思想
模块化设计一般有两个基本要求:
紧耦合:两个部分的交流很多,无法独立存在。
松耦合:两个部分的交流较少,有清晰简单的接口,可以独立存在。
一般来说,完成特定功能或被经常复用的一组语句应该采用函数来封装,并尽可能减少函数间参数和返回值的数量,这样复用的可能性越高。
尽可能合理划分功能块,功能块内部耦合紧密--紧耦合;
模块间关系尽可能简单,功能块之间耦合度低--松耦合。
F、函数的递归
递归的定义
函数作为一种代码封装,可以被其他程序调用,当然,也可以被函数内部代码调用。这种函数定义中调用函数自身的方式称为递归。就像一个人站在装满镜子的房间中,看到的影像就是递归的结果。
递归在数学和计算机应用上非常强大,能够非常简洁的解决重要问题。
递归
递归不是循环
阶乘的例子揭示了递归的两个关键特征:
(1)存在一个或多个基例,基例不需要再次递归,它是确定的表达式;
(2)计算出存在的递归链,所有递归链要以一个或多个基例结尾。
类似数学归纳法
(1)证明当n取第一个值的时候,命题成立
(2)假设当nk时命题成立,证明当n=nk+1时命题也成立
(3)递归是数学归纳法思维在编程中的体现
递归的使用方法
实例:阶乘的计算。
举例
分析
利用函数+分支语句实现上述代码。
递归本身是一个函数,需要以函数定义方式描述
函数内部,采用分支语句对输入参数进行判断
基例和递归链,分别编写对应的代码。
注意:
构造递归函数,需要基例
基例不进行递归,否则递归就会无限循环执行
此递归调用以字符串形式执行,应设置基例为空串
F、科赫曲线绘制
科赫曲线
高大上的分形几何
分形几何是一种迭代的几何图形,广泛存在于自然界中。(整体与局部有很强的相似性。)
科赫(Koch)曲线
在众多经典数学曲线中非常著名,由瑞典数学家冯·科赫(H·V·Koch)于1904年提出,由于其形状类似雪花,也被称为雪花曲线。
科赫曲线的基本概念和绘制方法如下:
正整数n代表科赫曲线的阶数,表示生成科赫曲线过程的操作次数。
科赫曲线初始化阶数为0,表示一个长度为L的直线。
对于直线L,将其等分为三段,中间一段用边长为L/3的等边三角形的两个边替代,得到1阶科赫曲线,它包含四条线段。
进一步对每条线段重复同样的操作后得到2阶科赫曲线。继续重复同样的操作n次可以得到n阶科赫曲线。
科赫曲线
科赫曲线属于分形几何分支,它的绘制过程体现了递归思想。
递归思想:函数+分支
递归链条:线段的组合
递归基例:初始线段
代码
结果
雪花效果:科赫曲线的组合
代码
结果
G、Python内置函数
Python解释器提供了68个内置函数,其中,前36个已经将结果,需要掌握。
内置函数
H、PyInstaller库基本介绍
需求:将python源代码(.py)转化为无需源代码的可执行文件。即:以可执行文件的方式执行一段程序,从而可以在未安装python IDLE和解释器的电脑上运行。
需要将源程序编译或者打包成一个直接可以执行的程序。
过程
PyInstaller是第三方库
官方网站:
http://http://www.pyinstaller.org/
第三方库:使用前需要额外安装
安装第三方库需要使用pip工具(使用cmd)
使用cmd命令行
pip
install pyinstaller
安装需要连接互联网
安装pyInstaller库后,会生成一个pyInstaller程序(命令),用于将源文件打包,生成可执行文件。
使用命令行(cmd),因为pyinstaller是命令行的执行程序,而不是python下面的执行指令。
pyinstaller–F
举例