python学习之自定义函数
一、不带参数函数
不带参数函数格式
def 函数名():
函数体
不带参数函数的一个案例
def _factor(): #定义函数
i=1
nums=10
print("%d的因数为:"%(nums))
while i<=nums: #循环求因数
if nums%i==0:
print('%d'%i)
i+=1
#===========================
_factor() #调用函数
t=type(_factor) #检查是否是函数类型
print(t)
'''结果为:
10的因数为:
1
2
5
10
<class 'function'> #是函数类型
'''
注意:使用自定义函数,必须先定义或先引入定义模块文件,再调用自定义函数。不能先调用,再定义,否则报“找不到自定义函数错误”。
二、带参数的函数
带参数函数格式
def 函数名(参数):
函数体
带参数函数案例
如:
def find_factors(nums):
i = 1
str1 = ''
print("%d的因数为:" % nums)
while i < nums:
if nums % i == 0:
str1 = str1 + ' ' + str(i) #用字符串记录一个整数的因数
i += 1
print(str1)
# =======================================
num_list = [10, 18, 20, 30]
i = 0
num_length = len(num_list)
while i < num_length:
find_factors(num_list[i])
i += 1
与不带参数的函数相比,更加灵活,实用,可以接受任意正整数的传递并求因数。
通常把def 函数名(参数)的参数叫形式参数,调用函数时赋予的值叫实际参数。
三、带返回值的函数
格式:
def 函数名([参数]):
函数体
return 返回值
函数返回值:不带return语句的函数,其实默认都返回None值,如调用_factor()(不带参数案例),
def _factor(): # 定义函数
i = 1
nums = 10
print("%d的因数为:" % (nums))
while i <= nums: # 循环求因数
if nums % i == 0:
print('%d' % i)
i += 1
# ===========================
# _factor() # 调用函数
print(_factor())
# t = type(_factor) # 检查是否是函数类型
# print(t)
'''结果为:
10的因数为:
1
2
5
10
None'''
return语句在函数中除了返回值外,还起中断函数执行作用。
如:
def test():
return 1 #return 将终止函数执行并返回值1
print("Yes") #该语句不会执行
print(test())
带返回值的函数的案例(求因数)
def find_factors(nums):
i = 1
str1 = ''
while i < nums:
if nums % i == 0:
str1 = str1 + ' ' + str(i) #用字符串记录一个整数的因数
i += 1
# print(str1)
return str1
# =======================================
num_list = [10, 18, 20, 30]
i = 0
num_length = len(num_list)
return_str=''
while i < num_length:
return_str=find_factors(num_list[i]) #循环调用函数,并返回因数字符串
print("%d的因数为:%s"%(num_list[i],return_str))
i += 1
结果为:
该案例的好处:
1、可以灵活获取处理结果,为调用代码所用
2、把附加的打印功能转移到函数体外,提高了调用者处理打印信息的灵活性。
四、自定义函数的完善
def find_factors(nums):
'''
find_factors是自定义函数
nums是传递正整数的参数
以字符串形式返回一个正整数的所有因数''' #用一对三个单引号来包括描述文档
i = 1
str1 = ''
while i < nums:
if nums % i == 0:
str1 = str1 + ' ' + str(i) #用字符串记录一个整数的因数
i += 1
# print(str1)
return str1
help(find_factors) #help函数用来获取函数的使用功能的信息。
可以得到以下结果:得到函数的相关信息,是用一对三个单引号的描述文档的内容。
健壮性考虑
函数的参数是传递值的入口,必须考虑所传递的值是否符合要求。
如向find_factors(nums)传递一个字符,一个符号
如find_factors(‘a’),
会出现
TypeError: ‘<’ not supported between instances of ‘int’ and ‘str’
错误。
实际应用中出现这样的错误会非常糟糕,所以要对函数进一步完善。
我们需要在函数中进行如下完善:
if type(nums)!=int:
print('输入值类型出错,必须是整数')
return
if nums<=0:
print('输入值范围出错,必须是正整数')
return
五、把函数放到模块中
自定义函数建立后,如果需要被其他代码文件调用(以.py为扩展名的文件),或者需要通过共享,让其他程序员使用,需要把函数代码单独存放到一个可以共享的地方。
在Python语言中,通过建立独立的函数模块(Module)文件(以.py为扩展名的文件),共享给其他代码文件调用。
1、建立函数模块
1)首先新建一个空白的代码文件,存放自定义函数代码,如建立一个test.py的空函数模块文件。
2)编写并调试完成自定义函数代码,如前面的find_factors(nums)函数。
3)把只属于自定义函数的代码复制到函数模块文件上,若有多个自定义函数,按照顺序复制即可。
test.py函数模块文件,实现了对find_factors(nums)函数代码的完整保存,完成这个过程后,该函数被其他python文件中的代码进行调用成了可能。
2、调用函数模块
在python语言编辑器里,除了默认内置函数外,其他函数的调用,必须先通过import语句进行导入,才能使用。
1)import语句导入整个函数模块
格式:import 函数模块名
(1)新建一个python文件,文件中输入调用代码
(2)执行后结果为:
import语句直接导入模块后,调用模块文件里的函数格式如下:
模块名.函数名
通过模块名中间连接点号与函数名连接方式调用函数。
注意:必须要保证 调用.py 和模块文件test.py在同一个文件夹下,不然会报“找不到模块错误(ModuleNotFoundError)”。
2)import导入指定函数
格式:from 模块名 import 函数名1[,函数名2,…]
# import test
# print(test.find_factors(9))
from test import find_factors
print(find_factors(9))
该方法可以像内置函数一样使用模块中的自定义函数。
3)import导入所以函数
格式:from 模块名 import *
"*"代表指定模块里的所有函数。
4)模块名、函数名别名方式
如果导入模块,函数时发现名称过长,可以通过as定义别名的方式解决。
格式:模块名[函数名] as 别名
import test as t #给模块名定义别名
print(t.find_factors(9))
from test import find_factors as f #为自定义函数定义别名
print(f(9))
as语句还可以解决函数名称发生冲突的问题。
3、模块搜索路径
主要是解决在不同文件夹下模块调用的访问路径的问题,不然会报“找不到模块”的错误。
用sys.path方法指定需要访问的函数模块文件。
import sys
sys.path[0] = 'C:\应用\Pycharm\文件\\function' # 模块路径
from test import find_factors
print(find_factors(10))
# 结果为:
# 1 2 5
正常的路径格式为’C:\应用\Pycharm\文件\function’格式,当时”\f“为”换页“转义字符,所以为了得到正确的路径,要在”\f“前在加一个”\“,让’\f‘原样输出。