老王讲IT:函数基础

IT老王:函数基础

目标

  • 函数的快速体验

  • 函数的基本使用

  • 函数的参数

  • 函数的返回值

  • 函数的嵌套调用

  • 在模块中定义函数

01. 函数的快速体验

1.1 快速体验

  • 所谓函数,就是把 具有独立功能的代码块 组织为一个小模块,在需要的时候 调用

  • 函数的使用包含两个步骤:

    1. 定义函数 —— 封装 独立的功能

    2. 调用函数 —— 享受 封装 的成果

  • 函数的作用,在开发程序时,使用函数可以提高编写的效率以及代码的 重用

演练步骤

  1. 新建 04_函数 项目

  2. 复制之前完成的 乘法表 文件

  3. 修改文件,增加函数定义 multiple_table():

  4. 新建另外一个文件,使用 import 导入并且调用函数

02. 函数基本使用

2.1 函数的定义

定义函数的格式如下:

def 函数名():
​函数封装的代码……
  1. def 是英文 define 的缩写

  2. 函数名称 应该能够表达 函数封装代码 的功能,方便后续的调用

  3. 函数名称 的命名应该 符合 标识符的命名规则

    • 可以由 字母下划线数字 组成

    • 不能以数字开头

    • 不能与关键字重名

2.2 函数调用

调用函数很简单的,通过 函数名() 即可完成对函数的调用

2.3 第一个函数演练

需求

    1. 编写一个打招呼 say_hello 的函数,封装三行打招呼的代码

    1. 在函数下方调用打招呼的代码

name = "小明"
​
​
# 解释器知道这里定义了一个函数
def say_hello():print("hello 1")print("hello 2")print("hello 3")
​
print(name)
# 只有在调用函数时,之前定义的函数才会被执行
# 函数执行完成之后,会重新回到之前的程序中,继续执行后续的代码
say_hello()
​
print(name)

单步执行 F8 和 F7 观察以下代码的执行过程

  • 定义好函数之后,只表示这个函数封装了一段代码而已

  • 如果不主动调用函数,函数是不会主动执行的

思考
  • 能否将 函数调用 放在 函数定义 的上方?

    • 不能!

    • 因为在 使用函数名 调用函数之前,必须要保证 Python 已经知道函数的存在

    • 否则控制台会提示 NameError: name 'say_hello' is not defined (名称错误:say_hello 这个名字没有被定义)

2.4 PyCharm 的调试工具

  • F8 Step Over 可以单步执行代码,会把函数调用看作是一行代码直接执行

  • F7 Step Into 可以单步执行代码,如果是函数,会进入函数内部

2.5 函数的文档注释

  • 在开发中,如果希望给函数添加注释,应该在 定义函数 的下方,使用 连续的三对引号

  • 连续的三对引号 之间编写对函数的说明文字

  • 函数调用 位置,使用快捷键 CTRL + Q 可以查看函数的说明信息

注意:因为 函数体相对比较独立函数定义的上方,应该和其他代码(包括注释)保留 两个空行

03. 函数的参数

演练需求

  1. 开发一个 sum_2_num 的函数

  2. 函数能够实现 两个数字的求和 功能

演练代码如下:

def sum_2_num():
​num1 = 10num2 = 20result = num1 + num2
​print("%d + %d = %d" % (num1, num2, result))
​
sum_2_num()

思考一下存在什么问题

函数只能处理 固定数值 的相加

如何解决?

  • 如果能够把需要计算的数字,在调用函数时,传递到函数内部就好了!

3.1 函数参数的使用

  • 在函数名的后面的小括号内部填写 参数

  • 多个参数之间使用 , 分隔

def sum_2_num(num1, num2):
​result = num1 + num2print("%d + %d = %d" % (num1, num2, result))
​
sum_2_num(50, 20)

3.2 参数的作用

  • 函数,把 具有独立功能的代码块 组织为一个小模块,在需要的时候 调用

  • 函数的参数,增加函数的 通用性,针对 相同的数据处理逻辑,能够 适应更多的数据

    1. 在函数 内部,把参数当做 变量 使用,进行需要的数据处理

    2. 函数调用时,按照函数定义的参数顺序,把 希望在函数内部处理的数据通过参数 传递

3.3 形参和实参

  • 形参定义 函数时,小括号中的参数,是用来接收参数用的,在函数内部 作为变量使用

  • 实参调用 函数时,小括号中的参数,是用来把数据传递到 函数内部 用的

04. 函数的返回值

  • 在程序开发中,有时候,会希望 一个函数执行结束后,告诉调用者一个结果,以便调用者针对具体的结果做后续的处理

  • 返回值 是函数 完成工作后,最后 给调用者的 一个结果

  • 在函数中使用 return 关键字可以返回结果

  • 调用函数一方,可以 使用变量接收 函数的返回结果

注意:return 表示返回,后续的代码都不会被执行

def sum_2_num(num1, num2):"""对两个数字的求和"""
​return num1 + num2
​
# 调用函数,并使用 result 变量接收计算结果
result = sum_2_num(10, 20)
​
print("计算结果是 %d" % result)

05. 函数的嵌套调用

  • 一个函数里面 又调用另外一个函数,这就是 函数嵌套调用

  • 如果函数 test2 中,调用了另外一个函数 test1

    • 那么执行到调用 test1 函数时,会先把函数 test1 中的任务都执行完

    • 才会回到 test2 中调用函数 test1 的位置,继续执行后续的代码

def test1():
​print("*" * 50)print("test 1")print("*" * 50)
​
​
def test2():
​print("-" * 50)print("test 2")test1()print("-" * 50)
​
test2()
​

函数嵌套的演练 —— 打印分隔线

体会一下工作中 需求是多变

需求 1

  • 定义一个 print_line 函数能够打印 * 组成的 一条分隔线

def print_line(char):
​print("*" * 50)
需求 2定义一个函数能够打印 由任意字符组成 的分隔线def print_line(char):
​print(char * 50)需求 3定义一个函数能够打印 任意重复次数 的分隔线def print_line(char, times):
​print(char * times)
​

需求 4

  • 定义一个函数能够打印 5 行 的分隔线,分隔线要求符合需求 3

提示:工作中针对需求的变化,应该冷静思考,不要轻易修改之前已经完成的,能够正常执行的函数

def print_line(char, times):
​print(char * times)
​
​
def print_lines(char, times):
​row = 0while row < 5:print_line(char, times)
​row += 1
​

06. 使用模块中的函数

模块是 Python 程序架构的一个核心概念

  • 模块 就好比是 工具包,要想使用这个工具包中的工具,就需要 导入 import 这个模块

  • 每一个以扩展名 py 结尾的 Python 源代码文件都是一个 模块

  • 在模块中定义的 全局变量函数 都是模块能够提供给外界直接使用的工具

6.1 第一个模块体验

步骤

  • 新建 hm_10_分隔线模块.py

    • 复制 hm_09_打印多条分隔线.py 中的内容,最后一行 print 代码除外

    • 增加一个字符串变量

name = "程序员"
  • 新建 hm_10_体验模块.py 文件,并且编写以下代码:

import hm_10_分隔线模块
​
hm_10_分隔线模块.print_line("-", 80)
print(hm_10_分隔线模块.name)
体验小结
  • 可以 在一个 Python 文件定义 变量 或者 函数

  • 然后在 另外一个文件中 使用 import 导入这个模块

  • 导入之后,就可以使用 模块名.变量 / 模块名.函数 的方式,使用这个模块中定义的变量或者函数

模块可以让 曾经编写过的代码 方便的被 复用

6.2 模块名也是一个标识符

  • 标示符可以由 字母下划线数字 组成

  • 不能以数字开头

  • 不能与关键字重名

注意:如果在给 Python 文件起名时,以数字开头 是无法在 PyCharm 中通过导入这个模块的

6.3 Pyc 文件(了解)

Ccompiled 编译过 的意思

操作步骤

  1. 浏览程序目录会发现一个 __pycache__ 的目录

  2. 目录下会有一个 hm_10_分隔线模块.cpython-35.pyc 文件,cpython-35 表示 Python 解释器的版本

  3. 这个 pyc 文件是由 Python 解释器将 模块的源码 转换为 字节码

    • Python 这样保存 字节码 是作为一种启动 速度的优化

字节码

  • Python 在解释源程序时是分成两个步骤的

    1. 首先处理源代码,编译 生成一个二进制 字节码

    2. 再对 字节码 进行处理,才会生成 CPU 能够识别的 机器码

  • 有了模块的字节码文件之后,下一次运行程序时,如果在 上次保存字节码之后 没有修改过源代码,Python 将会加载 .pyc 文件并跳过编译这个步骤

  • Python 重编译时,它会自动检查源文件和字节码文件的时间戳

  • 如果你又修改了源代码,下次程序运行时,字节码将自动重新创建

提示:有关模块以及模块的其他导入方式,后续课程还会逐渐展开!

模块是 Python 程序架构的一个核心概念

[老王讲IT 性感有魅力]  

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

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

相关文章

html加载后端数据较慢问题记载

标题: html加载后端数据较慢问题记载 日期: 2024-04-06 22:29:00 标签: [html, flask] 分类: [Python, Flask] 网站页面最近加载很慢&#xff0c;不知道为什么&#xff0c;这里记录一下&#xff0c;一步一步查问题的思路。 说下环境 python3.8 flask2.3.3 mysql5.7 问题 刷…

爬虫实战一、Scrapy开发环境(Win10+Anaconda3)搭建

#前言 在这儿推荐使用Anaconda进行安装&#xff0c;并不推荐大家用pythonpip安装&#xff0c;因为pythonpip的坑实在是太多了。 #一、环境中准备&#xff1a; Win10&#xff08;企业版&#xff09;Anaconda3-5.0.1-Windows-x86_64&#xff0c;下载地址&#xff0c;如果打不开…

每日OJ题_两个数组dp①_力扣1143. 最长公共子序列

目录 力扣1143. 最长公共子序列 解析代码 力扣1143. 最长公共子序列 1143. 最长公共子序列 难度 中等 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样…

尚硅谷html5+css3(2)CSS5基本知识

1.网页分为三个部分&#xff1a; 结构&#xff1a;HTML 表现&#xff1a;CSS 行为JavaScript CSS:层叠样式表&#xff0c;网页实际上是一个多层结构&#xff0c;通过CSS可以分别为网页的每一个层来设置样式&#xff0c;最终用户只看最上面的一层&#xff0c;总之&#xff0…

蚁群优化算法(Ant Colony Optimization Algorithm)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法引言 蚁群算法&#xff0c;是一种模拟蚂蚁觅食行为的优化算法。想象一下&#xff0c;当你在野餐时&#xff0c;不小心洒了一些糖在地上。一…

AcWing26. 二进制中1的个数。三种解法Java

输入一个 3232 位整数&#xff0c;输出该数二进制表示中 11 的个数。 注意&#xff1a; 负数在计算机中用其绝对值的补码来表示。 数据范围 −100≤ 输入整数 ≤100 样例1 输入&#xff1a;9 输出&#xff1a;2 解释&#xff1a;9的二进制表示是1001&#xff0c;一共有2个…

免疫检查点信号转导和癌症免疫治疗(文献)

目录 基础 介绍 免疫检查点的表面调控&#xff08;细胞膜层面&#xff09; ​编辑 PD-1调节 PD-L1调节 CTLA-4 调节 检查点信号通路 关于靶点研究 展望 Immune checkpoint signaling and cancer immunotherapy - PubMed (nih.gov) 基础 【中英字幕】肿瘤免疫疗法之免…

分享10个免费高可用的GPT3.5和4.0网站并做功能测试【第一个】

1.介绍 网址&#xff1a;直接点&#xff1a;aicnn 或者 www.aicnn.cn 基于ChatGPT可以实现智能聊天、绘画生成、高清文本转语音、论文润色等多种功能&#xff0c;基于sd和mj实现的绘画功能&#xff0c;下面是功能测试&#xff1a; 博主从 1.GPT3.5是否完全免费/是否限制频率、…

MySQL学习笔记------事务

事务 事务是一组操作的集合&#xff0c;他是一个不可分割的单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败 事务操作 create table account(id int comment ID,name varchar(10) …

如何成为一名嵌入式C语言高手?

如何成为一名嵌入式C语言高手? 嵌入式系统是当今科技领域的核心&#xff0c;而C语言则是嵌入式系统开发中最常用的编程语言之一。成为一名嵌入式C语言高手需要长时间的学习和实践。下面将介绍一些方法和技巧&#xff0c;帮助你在嵌入式C语言领域获得突出的技能和能力。 一、打…

Spring 中类似 aBbb 单字母单词序列化与反序列问题

文章目录 前言代码准备问题排查lombok自定义生成 get、set 结合源码解析使用 lombok使用 lombok 自定义生成 user 对象 get、set 方法 如何解决使用注解 JsonProperty("aTest")自定义实现符合 Spring 规范的 get set 方法 个人简介 前言 最近在使用 spring boot mvc…

Linux下Qt生成程序崩溃文件

文章目录 1.背景2.Qt编译生成程序2.1.profile模式的本质 3.执行程序&#xff0c;得到core文件4.代码定位4.1.直接使用gdb4.2.使用QtCreator 5.总结6.题外话6.1.profile模式和debug模式的区别 1.背景 在使用Qt时&#xff0c;假如在windows&#xff0c;当软件崩溃时&#xff0c;…

【整数二分】难题选讲

对应洛谷题单里面【整数二分】几道同学们不太好理解的题目&#xff0c;写个解析 A-1数对题目链接 实际上本题方法很多&#xff0c;我先说个好做的办法 我们可以用map标记所有数的个数&#xff0c;枚举数字A[i],在map里面查找C-A[i]数字的个数&#xff0c;统计答案即可&#xff…

C++11右值引用

传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c;所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用&#xff0c;都是给对象取别名。 左值与左值引用 左值是一个表示数据的表达式(如变量名或解引用的指针)&…

Qt-线程1-Run

0. 写在前面 一个应用程序一般只有一个线程&#xff0c;一个线程内的操作是顺序执行的&#xff0c;如果有某个比较耗时间的计算或操作&#xff0c;比如图像处理大数据图像、网络通信中的文件传输&#xff1b;在一个线程内操作时&#xff0c;用户界面就能冻结而不能及时响应。这…

34-2 SSRF(服务器端请求伪造)漏洞 - SSRF相关函数

简介 file_get_contents(): 功能: 该函数用于将整个文件读取到一个字符串中,可以用于获取本地或远程文件的内容。风险: 如果未经验证的用户输入作为参数传递给该函数,并且允许读取远程文件,则可能导致SSRF漏洞,攻击者可以利用该漏洞读取服务器内部的文件或者执行未经授权…

C++面试经典问题

常见问题&#xff1a;智能指针、多态、虚函数、STL原理、链表、排序、二叉树、设计模式、线程进程、内存 对象所有权 在接触智能指针之前首先要理解对象的所有权是什么&#xff0c;在这之前我们总是用new和delete来进行内存的申请与释放&#xff0c;在这种堆内存分配的方式中…

【退役之重学Java】关于lambda表达式和函数式接口

使用 lambda 表达式为作为实参&#xff0c;传递给形参&#xff0c;形参为函数式接口&#xff0c;此lambda表达式没有指定类型&#xff0c;如何能匹配函数式接口的形参类型呢&#xff1f; 函数式接口作为参数&#xff0c;实参可以直接用lambda表达式吗&#xff0c;是什么原理 函…

【嵌入式DIY实例】-MODBUS串行通信

MODBUS串行通信 文章目录 MODBUS串行通信1、什么是RS-4852、MAX485 TTL转RS485转换器3、硬件准备4、代码实现4.1 主机和从机之间简单通信4.2 主/从机之间LED控制在本文中,我们将介绍如何使用 MAX485 MODBUS 在Arduino之间进行串行通信。 我们将使用 Arduino nano 板和 MODBUS …