北理工嵩天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 函数的定义

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

    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
    
  • 函数定义时可以设计可变数量参数,既不确定参数总数量

    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)
    
  • 函数调用时,参数可以按照位置或名称方式传递

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

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
    

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函数
  • 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]
    

    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()

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

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()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值