码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 北理工嵩天Python语言程序设计笔记(6 函数和代码复用)


    前言

    本文是对《北理工 嵩天/黄天宇/礼欣 Python语言程序设计》的学习笔记,供自己查阅使用。

    文章目录

    1. 北理工嵩天Python语言程序设计笔记(目录)
    2. 北理工嵩天Python语言程序设计笔记(2 Python基本语法元素)
    3. 北理工嵩天Python语言程序设计笔记(3 Python基本图形绘制)
    4. 北理工嵩天Python语言程序设计笔记(4 基本数据类型)
    5. 北理工嵩天Python语言程序设计笔记(5 程序的控制结构)
    6. 北理工嵩天Python语言程序设计笔记(6 函数和代码复用)
    7. 北理工嵩天Python语言程序设计笔记(7 组合数据类型)
    8. 北理工嵩天Python语言程序设计笔记(8 文件和数据格式化)
    9. 北理工嵩天Python语言程序设计笔记(9 程序设计方法学)
    10. 北理工嵩天Python语言程序设计笔记(10 Python计算生态概览)

    笔记目录

    • 前言
    • 文章目录
    • 6 函数和代码复用
      • 6.1 函数的定义与使用
        • 6.1.1 函数的定义
        • 6.1.2 函数的使用及调用过程
        • 6.1.3 函数的参数传递
        • 6.1.4 函数的返回值
        • 6.1.5 局部变量和全局变量
        • 6.1.6 lambda函数
        • 6.1.7 内置函数
      • 6.2 实例7: 七段数码管绘制
      • 6.3 代码复用与函数递归
        • 6.3.1 代码复用与模块化设计
        • 6.3.2 函数递归的理解
        • 6.3.3 递归的实现
      • 6.4 模块4: PyInstaller库的使用
      • 6.5 实例8: 科赫雪花小包裹


    6 函数和代码复用

    6.1 函数的定义与使用

    6.1.1 函数的定义

    • 降低编程难度和代码复用

      def <函数名>(<参数(0个或多个)>):
      <函数体>
      return <返回值>

    • 函数定义时,所指定的参数是一种占位符

    • 函数定义后,如果不经过调用,不会被执行

    • 函数定义时,参数是输入、函数体是处理、结果是输出(IPO)

    6.1.2 函数的使用及调用过程

    • 调用是运行函数代码的方式

    • 调用时要给出实际参数

    • 实际参数替换定义中的参数

    • 函数调用后得到返回值

    6.1.3 函数的参数传递

    • 函数可以有参数,也可以没有,但必须保留括号

      def <函数名>():
      <函数体>
      return <返回值>

    • 可选参数传递,可选参数需要放在非可选参数后面,并且赋初值 def fact(n,m=1) :

      def <函数名>(<非可选参数>,<可选参数>):
      <函数体>
      return <返回值>

      def fact(n,m=1) :
      	s = 1
      	for i in range(1, n+1):
      		s *= i
      	return s//m
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 函数定义时可以设计可变数量参数,既不确定参数总数量

      def <函数名>(<参数>, *b):
      <函数体>
      return <返回值>

      def fact(n, *b) :
      	s = 1
      	for i inrange(1, n+1):
      		s *= i
      	for item in b:
      		s *= item
      	return s
      
      fact(10,3,5,8)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    • 函数调用时,参数可以按照位置或名称方式传递

      def fact(n,m=1) :
          
      fact(10,5 )  # 位置传递
      fact( m=5,n=10 )  # 名称传递
      
      • 1
      • 2
      • 3
      • 4

    6.1.4 函数的返回值

    • 函数可以返回0个或多个结果

    • 函数可以有返回值,也可以没有,可以有return,也可以没有

    • return可以传递0个返回值,也可以传递任意多个返回值

      return s//m, n, m
      >>>fact(10,5 )
      (725760, 10, 5)  # 元组
      >>>a,b,c= fact(10,5)
      >>>print(a,b,c)
      725760 10 5
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    6.1.5 局部变量和全局变量

    • 局部变量和全局变量是不同变量
      • 局部变量是函数内部的占位符,与全局变量可能重名但不同
      • 函数运算结束后,局部变量被释放
      • 可以使用global保留字在函数内部使用全局变量
    • 局部变量为组合数据类型且未创建,等同于全局变量

    6.1.6 lambda函数

    • lambda函数是一种匿名函数,即没有名字的函数
    • 使用lambda保留字定义,函数名是返回结果
    • lambda函数用于定义简单的、能够在一行内表示的函数

    <函数名> = lambda <参数>:<表达式>

    等价于

    def <函数名>(<参数>):
    <函数体>
    return <返回值>

    >>>f = lambda x, y : x + y
    >>>f(10, 15)
    25
    >>>f = lambda: "lambda函数"
    >>>print(f())
    lambda函数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • lambda函数主要用作一些特定函数或方法的参数
    • lambda函数有一些固定使用方式,建议逐步掌握
    • 一般情况,建议使用def定义的普通函数

    6.1.7 内置函数

    • Python map() 函数

      第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

      map(function, iterable, ...)
      >>> def square(x) :         # 计算平方数
      ...     return x ** 2
      ... 
      >>> map(square, [1,2,3,4,5])    # 计算列表各个元素的平方
      <map object at 0x100d3d550>     # 返回迭代器
      >>> list(map(square, [1,2,3,4,5]))   # 使用 list() 转换为列表
      [1, 4, 9, 16, 25]
      >>> list(map(lambda x: x ** 2, [1, 2, 3, 4, 5]))   # 使用 lambda 匿名函数
      [1, 4, 9, 16, 25]
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

      Python 2.x 返回列表。Python 3.x 返回迭代器。

    6.2 实例7: 七段数码管绘制

    import turtle, time
    
    
    def drawLine(draw):  # 绘制单段数码管
    
        turtle.pendown() if draw else turtle.penup()
        turtle.fd(40)
        turtle.right(90)
    
    
    def drawDigit(digit):  # 根据数字绘制七段数码管
        drawLine(True) if digit in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
        drawLine(True) if digit in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
        drawLine(True) if digit in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
        drawLine(True) if digit in [0, 2, 6, 8] else drawLine(False)
        turtle.left(90)
        drawLine(True) if digit in [0, 4, 5, 6, 8, 9] else drawLine(False)
        drawLine(True) if digit in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
        drawLine(True) if digit in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
        turtle.left(180)
        turtle.penup()  # 为绘制后续数字确定位置
        turtle.fd(20)  # 为绘制后续数字确定位置
    
    def drawDate(date):   #data为日期,格式为'%Y-%m=%d+'
        turtle.pencolor("red")
        for i in date:
            if i== '-':
                turtle.write('年',font=("Arial", 18, "normal"))
                turtle.pencolor("green")
                turtle.fd(40)
            elif i== '=':
                turtle.write('月',font=("Arial", 18, "normal"))
                turtle.pencolor("blue")
                turtle.fd(40)
            elif i== '+':
                turtle.write('日',font=("Arial", 18, "normal"))
            else:
                drawDigit(eval(i))
    
    
    def main():
        turtle.setup(800, 350, 200, 200)
        turtle.penup()
        turtle.fd(-300)
        turtle.pensize(5)
        drawDate(time.strftime('%Y-%m=%d+', time.gmtime()))
        turtle.hideturtle()
        turtle.done()
    
    
    main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    6.3 代码复用与函数递归

    6.3.1 代码复用与模块化设计

    • 代码复用:函数和对象是代码复用的两种主要形式
    • 模块化设计:分而治之,模块内部紧耦合、模块之间松耦合

    6.3.2 函数递归的理解

    • 函数定义中调用函数自身的方式

    • 链条:计算过程存在递归链条

    • 基例:存在一个或多个不需要再次递归的基例

    • 递归是数学归纳法思维的编程体现

    6.3.3 递归的实现

    • 递归本身是一个函数,需要函数定义方式描述
    • 函数内部,采用分支语句对输入参数进行判断
    • 基例和链条,分别编写对应代码

    eg. 斐波那契数列、汉诺塔

    6.4 模块4: PyInstaller库的使用

    • 将.py源代码转换成无需源代码的可执行文件

    (cmd命令行) pyinstaller -F <文件名.py>
    在这里插入图片描述

    pyinstaller –i curve.ico –F SevenDigitsDrawV2.py
    
    • 1

    6.5 实例8: 科赫雪花小包裹

    科赫雪花

    import turtle
    
    
    def koch(size, n):
        if n == 0:
            turtle.fd(size)
        else:
            for angle in [0, 60, -120, 60]:
                turtle.left(angle)
                koch(size / 3, n - 1)
    
    
    def main():
        turtle.setup(800, 400)
        turtle.penup()
        turtle.goto(-300, -50)
        turtle.pendown()
        turtle.pensize(2)
        koch(600, 3)  # 3阶科赫曲线,阶数
        turtle.hideturtle()
        turtle.done()
    
    
    main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 相关阅读:
    Linux网络编程开放资料
    java springboot儿童医药评价系统网站python
    和为K的子数组
    把所有的Linux命令制作成一张电脑壁纸,消耗了20红牛终于成了
    在HBuilderX中配置Vue Router的步骤
    css 文本溢出隐藏,显示省略号
    Pr:更改剪辑的速度和持续时间
    我的前端成长之路:中医药大学毕业的业务女前端修炼之路
    Spark学习(3)-Spark环境搭建-Standalone
    exoplayer的使用-4,手势,事件监听等
  • 原文地址:https://blog.csdn.net/yyywxk/article/details/127692273
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号