今天原本是个美好的周日,五一调休却把我从美梦中拉回现实:)周日上周一课,明天又上一遍,后天周二课又最多,一想到自己可以连着三天充分感受获得知识的快乐,我的眼角就不自觉地留下了幸福的泪水:_(
之前写程序的时候,除了Python自带的函数与指令以外,基本都是一行行地,需要什么功能当场写,下次用的时候Ctrl C、Ctrl V。这种写法在面对小工程小任务的时候还能应付,(以前我帮人写作业的时候图省事就经常这样,反正最后交的是板子也看不到程序,但其实这是个很不好的习惯,现在任务量大了也不敢这么写了。)但是当我们遇到稍微复杂些的任务时,这种方法往往就显得力不从心。
所以,这时候就应该把一些功能相同的程序单独提出来,让它们可以独立实现某些功能,并可以反复被调用,这就构成了一个函数。而且用函数的好处有:
- 程序简练
- 提高质量
- 可以共享
那么接下来,进入正文:
函数
函数格式
def 函数名([参数]):
函数体
[return 返回值]
#带中括号是说不是必须要有的
格式说明:
def:关键字,在自定义函数时以关键字def开始
函数名:不能与内置函数名、关键词等等相冲突。 而且命名最好能表达其功能,比如“Sensor_Set”这种,尽量不要用a,aa,aaa这样不知所云的方式命名
参数:其实是形式参数,根据需要,可以加参数,或者不加。之前刚学编程在实习的时候,带我的学长发现我当时写程序基本不带参数,也很少有返回值,就逼着我把绝大部分函数都改成有参数有返回值的样子,改得我痛不欲生…但这对我后来的编程起了很重要的帮助。每次定义函数前都应该仔细确认其功能,参数,返回值等等等等。
函数体:实现功能
返回值:与参数一样,根据需要添加。
定义函数
定义不带参数的函数
def 参数名():
函数体
以求5的阶乘为例:
def Factorial():
num = 5
out = 1
for i in range(1,num+1):
out = out * i
print(out)
嗯没错,这种没参数、没返回值、不能适用其他情况、并且没什么用的函数居然是我以前最习惯的写法:)往事不堪回首:_(
定义带参数的函数
def 参数名(参数):
函数体
这次则是以求任何数的阶乘为例
(这个求阶乘函数并不完整,详见下文“完善自定义函数”)
def Factorial(num):
out = 1
for i in range(1,num+1):
out = out * i
print(out)
输出结果:
>>> Factorial(5)
120
>>> Factorial(10)
3628800
定义带参数有返回值的函数
def 函数名(参数):
函数体
return 返回值
没错还是求阶乘
(这个求阶乘函数并不完整,详见下文“完善自定义函数”)
def Factorial(num):
out = 1
for i in range(1,num+1):
out = out * i
return out
这样求阶乘函数就可以多次被调用了:
Nums = [4,5,10]
j=0
while j < len(Nums):
print("%d! = %d"%( Nums[j],Factorial(Nums[j]) ) )
j+=1
输出:
4! = 24
5! = 120
10! = 3628800
完善自定义函数
之前的求阶乘函数并不是完整的求阶乘,还有几个条件没有考虑进去:
- 0!= 1
- 输入字符、负数、小数等情况不能求阶乘
在定义带参数的函数时,必须要考虑所传递的值是否符合要求,为了防止程序因报错而终止,我们要对这些情况做一些处理。
输入错误
对阶乘要考虑的是:非正整数,而这里又包含0和其他非正整数,所以应加上相应的判断语句:
def Factorial(num):
#——————————————————————
if num == 0:
return 1
elif type(num)!=int:
#print('输入类型错误,请输入正整数:')
return
elif num < 0:
#print('输入小于0,请输入正整数')
return
#——————————————————————
out = 1
for i in range(1,num+1):
out = out * i
return out
换一组数:
Nums = [-5 , -1.5 , 'A' , 0 , 5]
j=0
while j < len(Nums):
print(Factorial(Nums[j]))
j+=1
输出如图:
help:获取功能
自定义函数写完后,为了让我们在过了一段时间后,再用到它时能够快速回忆起这个函数的功能以及使用方法,这里就介绍一下help函数
先用help查看一下Python自带的函数:
这种注释我们自己也可以写,写法如下:
def Factorial(num):
'''
Factorial(num)是自定义函数
num:正整数参数
返回值:阶乘结果'''
if num == 0:
return 1
elif....(剩下内容都一样,就不赘述了)
help(Factorial)
查看结果:
函数模块
在自定义完一个函数以后,一般习惯把它放到一个单独的程序文件里,便于其他程序调用或者给别人使用。
建立函数模块
首先,建立一个新文件,命名。然后再把自定义函数复制粘贴再保存就好(文件后缀.py)
调用函数模块
把help函数删掉后,我把阶乘函数保存到test.py里,当我想在别的程序里调用时,有以下几种方法可选:
import语句:导入整个函数模块
(必须保证test.py文件和这个新的程序文件保存在同一个文件夹里)
import test #导入模块
print(test.Factorial(5)) #调用函数
调用函数的时候一定要在函数名前面加上:“文件名.”
有个“.”千万不要忘记写
F5执行后,依旧会输出120。
import语句:导入指定函数
(必须保证test.py文件和这个新的程序文件保存在同一个文件夹里)
- 导入单个函数
from test import Factorial
print(Factorial(5))
F5执行后,同样会输出120。
- 导入所有函数
现在,在test文件里增加一个函数
def KSY():
print('OHHHHHHH')
当我们想在别的程序文件里引入test文件内所有函数时,则要这么写:
from test import* #导入所有函数
print(Factorial(5))
KSY()
as:别名
当我们想调用的函数名或者文件名过长时,可以用 as 来给它起个别名
from test import Factorial as n_n #给函数起别名
print(n_n(5))
import test as T
T.KSY()
sys.path:搜索路径
当各种模块文件变多时,我们通常会将其放到单独一个文件夹里便于管理,但是在新程序里当我们想要调用时又会因为不在同一文件夹导致找不到模块而报错,所以这里引入sys.path方法搜索路径:
(我保存文件的地址是F:\Python_Le)
import sys
sys.path[0]='F:\Python_Le'
from test import*
KSY()
F5执行:
有一点要注意的是,如果我想调用的文件夹名是find之类以 f 开头的名称,在程序里为了避免与指令“ \f ”冲突,应该多加一个“ \ ”
import sys
sys.path[0]='F:\Python_Le\\find'
…
…
今天就说这么多好了,还剩一些内容会在两天内写完。其实Python的math库里是有求阶乘的函数的,而且我们用Python的原因之一就是计算方便、库的功能强大种类繁多等等等。