如果你学过其他语言那么你对函数恐怕不会陌生,函数是一个将代码封装起来的一个代码块,他可以实现对代码的重用,并且隐藏了代码的复杂性所以对于python函数是必不可少的
下面我便来介绍python的函数
一.函数的定义:
定义的结构:
def 函数名(参数名1:参数的类型,参数名2:参数的类型....) ->返回值的类型:
"""函数的说明文档"""
语句1
语句2.....
return 返回值
当然上面的参数的类型和返回值的类型可有可无,因为解释器并不会解释那几个说明,也不是检查你调用函数时是否与说明的类型是否一致
但是这对使用函数的人来说无疑是友好的,因为在python shell中当你使用help(方法名)命令式他会显示出函数的说明文档以及参数类型和返回
值类型
下面用一段代码来实例:
def findString(letter:str ,phrase :str="aeiou") ->set:#给phrase设置默认值,当没有参数是默认值为其后的值 """find out the phrase in letter""" return set(letter).intersection(set(phrase))
二.函数的使用
1.传参的说明:对于一个函数的使用传参肯定是一个必不可少的过程,但是由于python定义函数时并没有特意的规定哪个参数是什么类型,所以当调用函数是
所给的值的位置都是可以替换的,这将会导致得出得结果并不是你想象中得结果,因为当处理对象发生了改变时,毫无疑问结果肯定也会改变,所以对于传参
python中有两种:
一种是位置传参就是按照参数的位子来放置你指定的传入的值,这跟其他语言相同例如:findString(“sorry” ,"aeiou")
第二种是关键字传参根据提供的关键字来传参例如:findString(letter=“sorry” ,phrase="aeiou")
对于python的参数来说还有一种特列那就是收集参数,他会将你所有传来的参数当成一个元组,在函数中可以元组的方式直接使用,其定义·方法为:
def 方法名(*params):
语句....
下面以一段代码说明
def example(*params): print("参数的长度",len(params)) print(params[1])
#调用example(1,23,4,5)
#结果 4 23
对于含有收集参数的函数来说如果有两个参数的话例如example(*params,exe)
那么第二个参数则必须要用关键字传参
还有一种是收集参数让参数以字典的形式传入:
def 方法名(**params):
语句....
用法同上面
2.模块使用(一个python文件便是一个模块)
对于你创建的函数,你当然希望可以在其他模块中式用而不式仅限于当前模块,这便需要将你创建的模块导入到要使用的模块中去,这就像java中导入类一样
只有导入后可以使用另一个类中的方法(继承除外) ,当你要导入模块时解释器会先在当前工作目录找,如果找不到的话便会在解释器的site-packages位置找
这个位置包含了你已经安装了的第三方python模块,最后便会在标准库中找。
对于在当前目录下查找,一旦换了工作路径在进行模块导入无疑使非常麻烦的,所以我们将会介绍如何将模块发布到site-packages中,这样我们便可以在任意路径
商使用我们的模块了
创建一个发布描述:
首先在要建立的模块的文件夹中创建两个文件必须命名为setup.py和README.txt其中README.txt可为空文件
setup.py的编写格式为
from setuptools import setup #从setuptools模块中导入setup函数 setup( name='mypython', #指定发布包的名字 version='1.0', description='search package', author='',#空的都是可选的 author='', url='', py_modules=['findletter'], #包中所有“.py”文件的列表 )
生成一个发布文件(window):
在命令行窗口中,在你创建对应文件的目录下键入 py -3 setup.py sdist
执行之后会发现目录中会多两个文件夹一个使dist另一个是mypython.egg-info在dist中会有一个mypython-1.0.zip文件这便是我们的发布文件了
安装发布文件
有了发布文件我们便可以安装了对于python3.4及以上的版本有一个pip(package install for python)python的包安装工具可以是我们很方便
安装发布包我们只需要用管理员权限打开cmd然后键入py -3 -m pip install mypython-1.0.tar.gz便可安装
到这里我们便已经把我们想要的模块发布到site-packages中去了
这样我们便可以随意的在其他模块中调用该模块了,也可以将我们所写的模块共享给其他人例如:import findletter
findString("fdsf","aeiou");
三.函数中实参和形参值的问题
在c,java..中都会存在实参和形参的问题,python中也存在这样的问题,python中同样存在值传递和引用传递
对于可变的数据例如列表,字典,集合,总是按照引用来传入函数,也就是说在函数中改变,在调用代码中也会产生相应的改变
对于不可变的例如字符串,整数,元组,总是按照值来传入函数中,也就是说当在函数中改变时,在调用代码中不会发生改变
但是也许你会碰到下面的特殊情况:
def double(date): print("before",date) date=date*2 print("after",date)
>>> number=[1,23,4]
>>> double(number)
before [1, 23, 4]
after [1, 23, 4, 1, 23, 4]
>>> number
[1, 23, 4]
就算对于可变的列表在函数中值发生改变在调用代码中任然不变,这是因为date*2会产生一个新的对象,然后通过赋值语句
将新对象的引用覆盖掉date对就对象的引用,而不是改变所以在调用代码中任然存在所以不会发生改变