北理工嵩天Python语言程序设计笔记(6 函数和代码复用)

news2024/11/29 2:39:25

前言

本文是对《北理工 嵩天/黄天宇/礼欣 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
    
  • 函数定义时可以设计可变数量参数,既不确定参数总数量

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3GPP R17空闲态省电特性

Paging Early Indication 为了进一步降低空闲态UE监听PDCCH的功耗&#xff0c;R17提出Paging Early Indication(PEI)方案。方案的主要思想是在PO(Paging Occasion)之前插入一个PEI-O(PEI Occasion)&#xff0c;UE在解调到PEI信息之后&#xff0c;再确定是否需要解调PO信息。其中…

FPGA帧差算法实现图像识别跟踪,Verilog代码讲解全网最细,提供两套工程源码

之前我写过一篇关于FPGA帧差算法实现图像识别跟踪的文章&#xff0c;可以参考一下FPGA帧差算法实现图像识别跟踪 但那篇文章讲得不够细&#xff0c;这里讲得细一点&#xff1a; 运动目标检测原理&#xff1a;先将RGB图像转为灰度图只取亮度分量y&#xff0c;如果一个物体是运动…

【C++】如何修改set的值

问题&#xff1a;尝试通过begin方法得到的迭代器去修改值&#xff0c;发现会报错。 set<string> st{"hello", "world", "good"}; set<string>::iterator it st.begin(); *it "test"; 原因&#xff1a;我们可以在源码里…

三层交换机(三层配置基础命令)

作者介绍&#xff1a; ♥️作者&#xff1a;小刘在C站 ♥️每天分享课堂笔记&#xff0c;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放。 目录 一.什么是三层交换机 二.为什么使用三层交换机 三.层交换机的原理 1.传统的mls 2.快速转…

文件的基本操作

文章目录创建文件删除文件打开文件关闭文件读文件写文件这些基本功能都是操作系统提供给应用程序的系统调用创建文件 提供的参数 所需的外存空间大小文件的存放路径文件名&#xff08;操作系统会有对应的默认名&#xff09; 操作系统做的工作 在外存中找文件所需的空间——空闲…

Python趣味算法入门 - 百钱百鸡

问题描述 中国古代数学家张邱建在他的《算经》中提出了一个著名的“百钱百鸡问题”&#xff1a;一只公鸡值五钱&#xff0c;一只母鸡值三钱&#xff0c;三只小鸡值一钱&#xff0c;现在要用百钱买百鸡&#xff0c;请问公鸡、母鸡、小鸡各多少只&#xff1f; 分析 这也是经典问…

所见即所得即MySQL函数

✨✨hello&#xff0c;愿意点进来的小伙伴们&#xff0c;你们好呐&#xff01; &#x1f43b;&#x1f43b;系列专栏&#xff1a;【MySQL初阶】 &#x1f432;&#x1f432;本篇内容&#xff1a;MySQL函数的详解 &#x1f42f;&#x1f42f;作者简介:一名现大二的三非编程小白&…

【Spring】核心部分之IOC:通过列举代码例子,从底层刨析,深入源码,轻轻松松理解Spring的核心IOC,IOC有这一篇足以

IOC一&#xff0c;概念和原理1.概念&#xff1a;控制反转2.原理&#xff1a;&#xff08;xml解析&#xff0c;工厂模式&#xff0c;反射&#xff09;3.IOC接口&#xff1a;两个主要容器实现类&#xff08;加载xml配置文件&#xff09;二&#xff0c;操作Bean管理1.基于 xml 配置…

React - 实现瀑布流加载

React - 实现瀑布流加载一. 瀑布流实现1.1 处理重复请求问题一. 瀑布流实现 先来看下原本的效果&#xff0c;一次性加载完所有的信息然后展示&#xff1a; 其次&#xff0c;我们需要去监听这个滚轮的滚动事件&#xff0c;那么React页面就可以添加一个监听器&#xff1a; use…

SpringSecurity Oauth2实战 - 04 自定义AuthProvider实现登录认证

文章目录1. 搭建资源服务器1. Token存储配置类 TokenStoreAutoConfiguration2. 资源服务器配置类 ResourceServerAutoConfiguration3. 在META-INF/spring.factories文件下添加配置类2. 搭建授权服务器1. 密码加密配置类 PasswordEncodeConfig2. RestTemplateConfig3. 授权服务器…

k3s 离线部署指南

文章目录1. 简介2. Docker 手动部署镜像方式2.1 安装docker2.2 导入镜像2.3 安装 k3s2.4 查看3. Containerd 手动部署镜像方式3.1 导入镜像到 containerd 镜像列表3.2 授予可执行权限3.3 安装 K3s4. Containerd 私有镜像仓库方式4.1 配置 K3s 镜像仓库4.2 授予可执行权限4.3…

集合(Set)和有序集合(ZSet)的基本使用方法详解【Redis】

文章目录一. Redis中的集合(Set)1.1基本的一些操作1.1.1 smembers查看集合中的所有成员1.1.2 scard删除成员数量1.1.3 smove移动成员1.1.4 sinterstore 存储俩个集合的交集二.Redis中的有序集合(ZSet)2.1 基本的一些操作2.1.1 zadd添加1到多个成员2.1.2 zcount 返回指定分数区间…

【HarmonyOS】鸿蒙轻量级智能穿戴应用可以集成华为分析SDK吗?

1、问题描述 我们的项目是基于鸿蒙系统开发的轻量级智能穿戴应用&#xff0c;目前在做的主要是运动手表GT3。 我们在项目中使用了华为分析服务&#xff0c;但是在Build Hap时出现问题&#xff1a; 因此&#xff0c;我们想了解轻量级智能穿戴应用项目中是否能够集成华为分析服…

计算机毕业设计(附源码)python在线影评系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Leetcode-每日一题1106. 解析布尔表达式(DFS模拟栈)

题目链接&#xff1a;点击跳转 思路 方法一、DFS模拟栈 题目意思很简单让你去判断与或非布尔表达式的结果&#xff0c;我们可以看布尔表达式看成一棵树&#xff0c;需要我们解决的是从最底层的嵌套布尔表达式产生的结果不断向上的结果&#xff0c;如图&#xff1a; 既然他是…

云栖大会开源重磅升级!PolarDB-X v2.2: 企业级和国产化适配

2022 年云栖大会上&#xff0c;PolarDB-X 发布 2.2.0 版本&#xff0c;这是一个重要的里程碑版本&#xff0c;重点推出符合分布式数据库金融标准下的企业级和国产化适配&#xff0c;共包括八大核心特性&#xff0c;全面提升 PolarDB-X 分布式数据库在金融、通讯、政务等行业的普…

自定义分页器

文章目录自定义分页器1、分页推导2、分页器代码封装自定义分页器 1、分页推导 queryset对象支持切片操作 确定用户访问的页码 url?page1 current_pagerequest.GET.get(page,1)前端获取到 的都是字符串数据&#xff0c;需要类型转换 current_page request.GET.get(page,…

为什么C语言执行效率高,运行快?

目录 简述C语言由来 BCPL语言及代码B语言以及代码C语言 编程语言 机器语言汇编语言高级语言 C为何快速 简述 都说C语言编写的程序执行效率比较高&#xff0c;那么到底高在哪里&#xff0c;我们一块来学习学习。 C语言由来 C语言源自于BCPL、B两种语言。 BCPL语言以及代码…

django csrfMiddleware的一些理解跨站和跨域

术语 术语解释备注跨域两个 URL 的“协议主机名端口”3者只要有一个不一致http://www.taobao.com/和https://www.taobao.com/跨站两个 URL 的 eTLD1 不相同a.github.io 和 b.github.ioeTLDeffective top level domain &#xff08;有效顶级域名&#xff09;.com、.co.uk、.git…

第六节:数组的定义与使用【java】

目录 &#x1f4c3;1. 数组的基本概念 1.1 为什么要使用数组 1.2 什么是数组 1.3 数组的创建及初始化 1.4 数组的使用 &#x1f392;2. 数组是引用类型 2.1 初始JVM的内存分布 2.2 基本类型变量与引用类型变量的区别 2.3 认识 null 2.4 再谈引用变量 &#x1f4d6;3. …