zoukankan      html  css  js  c++  java
  • Python基础之函数和模块

    函数的基本使用

    • 函数的定义:把具有独立功能的代码块组织成一个小模块,在需要的时候调用。或者说,函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
    • 函数的使用:1.定义函数;2.调用函数。
    • 函数的作用:能提高应用的模块性,和代码的重复利用率。
    • 自己创建函数,叫做用户自定义函数。

    函数的快速体验

    在一个py文件中定义一个函数,在另一个文件中,导入函数,调用函数。

    定义函数:
    hello_func.py

    def hello():
        print("hello world")
        print("hello python")
    

    调用函数:
    sayhello.py

    import hello_func
    hello_func.hello()
    

    函数定义的语法格式

    def 函数名():
    	被封装的函数代码
    

    函数的命名

    • 函数名称,应该见名知意
    • 应该符合 标识符的命名规则
    • 由字母,数字,下划线组成
    • 不能以数字开头
    • 不能与关键字重名

    函数的调用

    直接 函数名() 即可;调用格式及示例如下:

    # 函数名()
    sayhello()
    

    函数演练

    def say_hello():
    	print("hello world 1")
    	print("hello world 2")
    	print("hello world 3")
    
    say_hello()
    

    函数的注意事项

    1. 函数被定义后并不会被运行,只是封装了函数而已,要使用函数需要调用函数。

    2. 当断点调试经过函数时,并不会执行,会跳过,只有当后面调用时,才会去函数中依次执行代码,执行完成后再重新回到调用函数后面的代码

    3. 先定义再调用;没定义函数就先调用,会报错;所以应该先定义函数,再调用函数;

    4. f8和f7单步越过和单步进入;f8单步执行时,经过函数调用时会直接执行整的函数而不进入内部;
      f7单步执行时,经过函数调用时会进入函数内部一步一步执行。

    函数的文档注释

    在函数定义下的第一行,添加连续的三对双引号,在双引号中间进行文字注释;
    在函数调用处可以用ctrl+q,查看函数说明
    注释如下:

    def say_hello():
        """输出三次打招呼"""
        print("hello 黎明1")
        print("hello 黎明2")
        print("hello 黎明3")
    

    函数的参数与返回值

    无参数的函数示例

    def sum2num():
        num1 = 10
        num2 = 20
        s = num1 + num2
    
        print("%d和%d的和为%d" % (num1, num2, s))
    
    
    sum2num()
    

    没有参数的函数只能计算固定的数字,过于死板,作用不大。

    函数参数的使用

    def sum2num(num1, num2):
        """将传进来的两个参数求和并输出"""
        s = num1 + num2
        print("%d和%d的和为%d" % (num1, num2, s))
    
    
    sum2num(10, 20)  # 10和20的和为30
    sum2num(30, 45)  # 30和45的和为75
    

    参数的使用:在函数名后面的小括号内填写参数,多个参数之间用逗号分隔;

    参数的作用
    增加函数的通用性,真毒以相同的数据处理逻辑,能够适应更多的数据。
    1.在函数内部,把参数当做变量使用,进行需要的数据处理;
    2.函数调用时,按照函数定义的参数顺序,把希望在函数内部处理的数据,通过参数传递。

    形参和实参

    定义函数时传递的参数叫形参,用来接收参数用的,在函数内部作为变量使用;
    调用函数时传递的参数叫实参,用来把数据传到函数内部;
    例如:

    def sum2num(num1, num2):  # 这里的就是形参,即形式参数,一个架子,同时函数内部使用的,都是形参
        s = num1 + num2
        print("%d和%d的和为%d" % (num1, num2, s))
    
    
    sum2num(10, 20)  # 这里的就是实参,即实际传送的参数
    sum2num(30, 45)  # 这里的就是实参,即实际传送的参数
    

    函数返回值

    • 函数在执行后,返回给调用者函数执行的结果,方便调用者针对返回结果做相应的处理;
    • 在函数中想要返回结果,用一个return 加上要返回的结果即可;
    • 在调用函数后,想要函数返回的结果,用一个变量接收即可。

    接收函数的返回值示例

    def sum2num(num1, num2):
        """将传进来的两个参数求和并返回结果"""
        s = num1 + num2
        # 可以用返回值,告诉调用者计算结果
        return s
    
    
    # 可以用变量接收函数的返回结果
    result = sum2num(10, 20)
    print("计算结果为:%d" % result)
    

    return关键字的注意事项:return表示返回,后面的函数代码都不会被执行(无法到达),应注意别在return下面写代码

    函数的嵌套调用

    函数嵌套调用示例

    函数的嵌套调用示例

    def test1():
        print("*"*50)
    
    
    def test2():
        print("-"*50)
        test1()
        print("+"*50)
    
    
    test2()
    # 执行结果如下
    # --------------------------------------------------
    # **************************************************
    # ++++++++++++++++++++++++++++++++++++++++++++++++++
    

    参数与分割线的打印示例

    # 版本1
    # def print_line():
    #     print("*" * 50)
    # print_line()
    
    
    # 版本2
    # def print_line(char):
    #     print(char * 50)
    # print_line("-")
    
    # 版本3
    def print_line(char, times):
        print(char * times)
    print_line("hi ", 50)
    

    打印多行分割线示例

    def print_line(char, times):
        print(char * times)
    
    
    def print_lines():
        row = 1
        while row <= 5:
            print_line("-", 50)
            row += 1
    
    
    print_lines()
    

    按需打印分割线示例

    def print_line(char, times):
        print(char * times)
    
    
    def print_lines(char, times, lines):
        row = 1
        while row <= lines:
            print_line(char, times)
            row += 1
    
    
    print_lines("-", 40, 6)
    print_lines("+", 50, 6)
    

    给函数增加文档注释

    当参数过多或者过久了再看代码,极有可能会忘记各个参数代表什么,因此很有必要添加文档注释;
    增加函数文档注释有两种方法:

    1. 当函数写完后,在def下一行添加三个一对双引号,回车,系统就会自动帮你生成含函数参数的部分注释,再加上自己的注释即可;
    2. 点击函数名,将鼠标移动到出现的灯泡处,会有一个小三角,点击找到 给函数添加短文档注释,然后添加自己的注释即可。

    添加文档注释后效果如下:

    def print_line(char, times):
        """
        :param char:用于分割的字符
        :param times:每行分割字符的数量
        :return:
        """
        print(char * times)
    
    
    def print_lines(char, times, lines):
        """
        按照客户需求打印分割线,完全自定义打印多少行,什么分隔符,每行多少个分隔符
        :param char: 用于分割的字符
        :param times: 每行分割字符的数量
        :param lines: 打印分割线的行数
        :return:
        """
        row = 1
        while row <= lines:
            print_line(char, times)
            row += 1
    
    
    print_lines("-", 40, 6)
    print_lines("+", 50, 6)
    

    eval函数

    eval函数的介绍和简单使用

    eval()函数十分强大,能够将字符串当成有效的表达式来求值并返回计算结果;

    # 基本的数学计算
    print(eval("1+1"))
    # 字符串重复
    print(eval("'*'*10"))
    # 将用户输入的字符串转换为字典
    userinfo = input("请输入一个字典:")
    print(type(eval(userinfo)))
    
    # 2
    # **********
    # 请输入一个字典:{"name":"zhangsan", "age":"18"}
    # <class 'dict'>
    

    eval函数计算题示例:

    user_str = input("请输入一个算术题:")
    
    print(eval(user_str))
    
    # 请输入一个算术题:(2+3)*5
    # 25
    

    谨慎使用eval函数

    不滥用eval,防止代码注入
    在开发时千万不要使用eval直接转换input的结果;

    在讲为什么之前先了解前置知识:

        __import__('os').system('ls')
        等价于
        import os
        os.system("ls")
    

    执行成功,返回0;
    执行失败,返回错误信息;

    那么,加入用户用这个恶意攻击你的系统?

    user_str = input("请输入一个算术题:")
    
    print(eval(user_str))
    
    
    # 请输入一个算术题:__import__('os').getcwd()
    # E:Pycharmxxxxxx4文件操作
    
    # 请输入一个算术题:__import__('os').path.basename(__file__)
    # cp_08计算器案例.py
    

    如上,两次执行,一次通过os模块获取当前目录,一次通过os模块获取当前文件名,那么再继续下去呢?
    所以,不要滥用eval函数!

    模块的介绍

    模块时Python程序架构的一个核心概念;
    模块就好比一个工具包,而里面的函数和变量就是工具;

    模块的概念

    所有以.py结尾的源文件都是一个模块,在文件中定义的[全局]变量和函数都能给外界使用,使用的前提是import导入模块

    模块的演练

    在一个文件创建两个函数和一个全局变量,在另一个文件导入第一个文件,.函数 即可调用函数, .变量 即可调用变量

    定义函数:
    hello_func.py

    def hello():
        print("hello world")
        print("hello python")
    
    name = "小明"
    

    调用函数:
    sayhello.py

    import cp_01hello_func
    
    hello_func.hello()
    hello_func.name
    

    注意:模块名也是标识符,需要遵循标识符的命名规则
    如果在给py文件命名时以数字开头,在pycharm中无法调用这个模块,会报错;

    pyc文件提高程序性能(了解即可)

    当我们导入模块时,系统会检查是否有这个模块的编译缓存文件,如果没有则创建,有则不做事,因为对模块文件进行了预编译缓存,所以当我们调用时就不需要重新去模块中一行一行执行了,而是直接使用。
    为什么会将模块预编译成二进制文件?因为模块时已经经过测试的代码,并且修改较少,所以可以进行预编译,就算偶尔进行了修改,程序也能帮我们进行检测重新编译新的二进制文件。

  • 相关阅读:
    [leetcode] Weekly Contest 170 Summary
    [Scala] java使用scala的jar包问题:Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Short
    [git] Updates were rejected because the tip of your current branch is behind its remote counterpart.
    [Android] Installation failed due to: ''pm install-create -r -t -S 4590498' returns error 'UNSUPPORTED''
    CTF 常见操作总结
    记项目管理大作业Web项目Mandrian的全流程[其一] 整体分析: 功能划分, 组织结构
    [leetcode] 题解记录 11-20
    [leetcode] 题解记录 1-10
    记一次配置阿里云ECS GPU计算型gn5实例
    shell脚本 入门 —— 符号篇
  • 原文地址:https://www.cnblogs.com/yifchan/p/python-1-4.html
Copyright © 2011-2022 走看看