zoukankan      html  css  js  c++  java
  • python的函数

    如果你学过其他语言那么你对函数恐怕不会陌生,函数是一个将代码封装起来的一个代码块,他可以实现对代码的重用,并且隐藏了代码的复杂性所以对于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对就对象的引用,而不是改变所以在调用代码中任然存在所以不会发生改变

  • 相关阅读:
    03_ if 练习 _ little2big
    uva 11275 3D Triangles
    uva 12296 Pieces and Discs
    uvalive 3218 Find the Border
    uvalive 2797 Monster Trap
    uvalive 4992 Jungle Outpost
    uva 2218 Triathlon
    uvalive 3890 Most Distant Point from the Sea
    uvalive 4728 Squares
    uva 10256 The Great Divide
  • 原文地址:https://www.cnblogs.com/sank/p/10091286.html
Copyright © 2011-2022 走看看