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对就对象的引用,而不是改变所以在调用代码中任然存在所以不会发生改变

  • 相关阅读:
    nodejs文本文件的读写
    nodejs目录与文件遍历
    问题建模
    Using JavaScript with WKWebView in iOS 8
    git 合并提交
    iOS中类簇的使用--__NSPlaceholderArray __NSPlaceholderDictionary
    QQ音乐Android客户端Web页面通用性能优化实践
    HDFS+ClickHouse+Spark:从0到1实现一款轻量级大数据分析系统
    图计算黑科技:打开中文词嵌入训练实践新模式
    腾讯“神盾-联邦计算”平台带你翻越数据合作的重重大山
  • 原文地址:https://www.cnblogs.com/sank/p/10091286.html
Copyright © 2011-2022 走看看