文章目录
1、函数入门
两个文件,一个函数定义,一个函数调用
1.1 函数定义
hm_01_函数定义.py
def multiple_table():
i = 1
while i <= 9:
j = 1
while j <= i:
print('%d*%d=%d' % (j, i, i * j), end='\t')
j += 1
print()
i += 1
1.2 函数调用
hm_02_调用函数.py
import hm_01_函数定义 # 文件名不要以数字开头
print("调用工具包: 工具包名称.方法")
hm_01_函数定义.multiple_table()
1.3 导入自己写的.py文件报红
将.py文件所在目录标记为源目录Sources Root即可
2、函数基本使用
2.1 函数的定义
def 函数名():
函数封装的代码
……
函数名称需得是合法标识符
2.2 函数调用
调用函数很简单的,通过
函数名()
即可完成对函数的调用
2.3 第一个函数演练
需求
-
- 在utils.py中编写一个打招呼
countSum
的函数,求前n项和
- 在utils.py中编写一个打招呼
-
- 在另一个.py调用
countSum
的代码
- 在另一个.py调用
- (注:两个文件在同一个目录下 将该目录 Mark Directory as -> Sources Root 否则pycharm检测不到)
utils.py
def countSum(n):
sumN, i = 0, 0
while i <= n:
sumN += i
i += 1
return sumN
#print(countSum(100))
01-函数定义调用.py
import utils
n = 100
ans = utils.countSum(n)*10-100
print(ans)
2.4 PyCharm 的调试工具 Debug
- F8 Step Over 可以单步执行代码,会把函数调用看作是一行代码直接执行
- F7 Step Into 可以单步执行代码,如果是函数, 会进入函数内部
- F9 Resume Program 执行到下一个断点
文件内任意位置 右键Debug运行
2.5 函数的文档注释 (说明文档)
函数定义下方 以多行注释的形式给出
多行注释按enter 自动补全格式
- 在开发中,如果希望给函数添加注释,应该在 定义函数 的下方,使用 连续的三对引号 (就是def行下方写的多行注释)
- 在 连续的三对引号 之间编写对函数的说明文字
- 在 函数调用 位置,使用快捷键
CTRL + Q
可以查看函数的说明信息
注意:因为 函数体相对比较独立,函数定义的上方,应该和其他代码(包括注释)保留 两个空行
def sayHello(n):
"""输出'hello world'
:param n: 输出个数
:return: void
"""
print('hello world '*n)
sayHello(10)
函数说明直接就写在第一个’''后面 不要换行了
参数说明和函数说明之间空一行
还可以调整一下显示方式
help(函数名) 打印文档
def sayHello(n):
"""输出'hello world'
:param n: 输出个数
:return: void
"""
print('hello world '*n)
help(sayHello)
3. 函数的参数
演练需求
- 开发一个
sum_2_num
的函数 - 函数能够实现 两个数字的求和 功能
演练代码如下:
def sum_2_num():
num1 = 10
num2 = 20
result = num1 + num2
print("%d + %d = %d" % (num1, num2, result))
sum_2_num()
思考一下存在什么问题
函数只能处理 固定数值 的相加
如何解决?
- 如果能够把需要计算的数字,在调用函数时,传递到函数内部就好了!
3.1 函数参数的使用
- 在函数名的后面的小括号内部填写 参数
- 多个参数之间使用
,
分隔
def sum_2_num(num1, num2):
result = num1 + num2
print("%d + %d = %d" % (num1, num2, result))
sum_2_num(50, 20)
3.2 参数的作用
- 函数,把 具有独立功能的代码块 组织为一个小模块,在需要的时候 调用
- 函数的参数,增加函数的 通用性,针对 相同的数据处理逻辑,能够 适应更多的数据
- 在函数 内部,把参数当做 变量 使用,进行需要的数据处理
- 函数调用时,按照函数定义的参数顺序,把 希望在函数内部处理的数据,通过参数 传递
3.3 形参和实参
- 形参:定义 函数时,小括号中的参数,是用来接收参数用的,在函数内部 作为变量使用
- 实参:调用 函数时,小括号中的参数,是用来把数据传递到 函数内部 用的
3.4 默认参数值
# 函数参数提供默认值
def add_ab(a=1, b=2):
return a + b
x = add_ab(5, 6)
y = add_ab() # 提供了默认值得参数,可以不指定实参值,执行时使用默认值
print(x,y)
3.5 可变(不定长)参数
# 可变参数函数
def add_nums(a, *args):
for i in args:
a += i
return a
print(add_nums(1, 2))
print(add_nums(1, 2, 3, 4))
print(add_nums(1, 2, 3, 4, 5))
可变参数是键值对
# 可变参数是键值对
# 并如何方便地遍历键值对
def add_nums2(a,**kvargs):
for key,value in kvargs.items():
print(key,value) #直接打印2个参数
add_nums2(1,x=3,y=4,z=5)
4. 函数的返回值
- 在程序开发中,有时候,会希望 一个函数执行结束后,告诉调用者一个结果,以便调用者针对具体的结果做后续的处理
- 返回值 是函数 完成工作后,最后 给调用者的 一个结果
- 在函数中使用
return
关键字可以返回结果 - 调用函数一方,可以 使用变量 来 接收 函数的返回结果
注意:
return
表示返回,后续的代码都不会被执行
def sum_2_num(num1, num2):
"""对两个数字的求和"""
return num1 + num2
# 调用函数,并使用 result 变量接收计算结果
result = sum_2_num(10, 20)
print("计算结果是 %d" % result)
5. 一个函数多个返回值
# 可以直接返回多个返回值
def max_min(*arr):
a = max(arr)
b = min(arr)
return a, b
a, b = max_min(3, 4, 9, 0, 19, 23, 12)
print(a, b)
6. 使用模块中的函数
模块是 Python 程序架构的一个核心概念
- 模块 就好比是 工具包,要想使用这个工具包中的工具,就需要 导入 import 这个模块
- 每一个以扩展名
py
结尾的Python
源代码文件都是一个 模块 - 在模块中定义的 全局变量 、 函数 都是模块能够提供给外界直接使用的工具
- 模块名得是合法标识符
6.1 第一个模块体验
whu_创建模块.py
# 一个.py文件就是一个模块
# 全局函数
def add(a, b):
return a + b
# 全局函数
def add(*arg):
sumA = 0
for i in arg:
sumA += i
return sumA
# 全局变量
name = '全局变量'
whu_体验模块.py
import whu_创建模块
a1 = whu_创建模块.add(10, 20)
print(a1) #30
a2 = whu_创建模块.add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
print(a2) #55
print(whu_创建模块.name) #'全局变量'
别忘了标记目录为 sources root
体验小结
- 可以 在一个 Python 文件 中 定义 变量 或者 函数
- 然后在 另外一个文件中 使用
import
导入这个模块 - 导入之后,就可以使用
模块名.变量
/模块名.函数
的方式,使用这个模块中定义的变量或者函数
6.2 模块名也是一个标识符
- 标示符可以由 字母、下划线 和 数字 组成
- 不能以数字开头
- 不能与关键字重名
注意:如果在给 Python 文件起名时,以数字开头 是无法在
PyCharm
中通过导入这个模块的
6.3 Pyc 文件(了解)
C
是compiled
编译过 的意思
操作步骤
- 浏览程序目录会发现一个
__pycache__
的目录 - 目录下会有一个
whu_创建模块.cpython-39.pyc
文件,cpython-39
表示Python
解释器的版本 - 这个
pyc
文件是由 Python 解释器将 模块的源码 转换为 字节码Python
这样保存 字节码 是作为一种启动 速度的优化
import xxx.py
则 xxx.py会被认为是一个写好的工具,不需要(或者很少)修改了,直接用c编译器给他编译好,以后调用模块里的东西不必一行行解释了,直接就是二进制了
字节码
-
Python
在解释源程序时是分成两个步骤的- 首先处理源代码,编译 生成一个二进制 字节码
- 再对 字节码 进行处理,才会生成 CPU 能够识别的 机器码
-
有了模块的字节码文件之后,下一次运行程序时,如果在 上次保存字节码之后 没有修改过源代码,Python 将会加载 .pyc 文件并跳过编译这个步骤
-
当
Python
重编译时,它会自动检查源文件和字节码文件的时间戳(很好判定是否有被修改) -
如果你又修改了源代码,下次程序运行时,字节码将自动重新创建
提示:有关模块以及模块的其他导入方式,后续课程还会逐渐展开!
模块是 Python 程序架构的一个核心概念