python学习笔记第六天函数基础
函数简介
定义:具有特定功能的一段代码
优点:
可以减少代码的重复书写
可以将功能的实现着和使用者分开,提高开发效率
分类:
库函数:print、input、type、len、abs、round、ord、chr等
自定义:用户自己设计封装的函数
函数使用
定义格式
def 函数名([参数列表]):
函数体
使用说明:
def:定义函数的关键字
函数名:符合标识符的命名规范即可
参数列表:完成特定功能所需的条件,[]表示可选的
函数体:实现特定功能的代码内容
函数调用:
函数不调用是不会执行的
调用格式:函数名([参数列表])
函数分类
说明:按照参数及返回值的有无进行分类
示例:
# 无参无返回值
def print_ten_hello():
for i in range(10):
print('Hello world!')
# 带参无返回值
def print_n_hello(n=10):
for i in range(n):
print('Hello world!')
# print_n_hello(3)
# 带参有返回值
def add(a, b):
# print(a+b)
# 返回结果:一旦执行return,函数就结束了
# 若没有指定返回值,默认返回None
return a+b
print('此处永远无法执行')
print(add(3, 5))
参数使用
形参:形式参数,写在函数定义处的参数
实参:实际参数,写在函数调用处的参数
位置参数:函数定义时没有默认值的参数称为位置参数,也叫必传参数,实参必须与其对应
默认参数:函数定义时有默认值的参数称为默认参数,调用时可以不传。默认参数必须放在最后
关键字参数:函数调用时指定参数名字进行传参,这样参数的顺序就无所谓了
可变长度参数:
# 可变长度参数
def var_len_args(a, b, *args, **kwargs):
print(a, b)
# args:是一个元组,保存多传的位置参数
print('args:', args)
# kwargs:是一个字典,保存多传的关键字参数
print('kwargs:', kwargs)
var_len_args(1, 2, 3, 4, name='dahua', age=18)
# `*`的作用
```python
def test(a, b):
print(a, b)
# test(100, 200)
lt = [100, 200]
# test(lt[0], lt[1])
# 与上面等价,*相当于将序列中的元素展开作为函数参数
test(*lt)
def test2(aa, bb):
print(aa, bb)
dt = {'aa': '123', 'bb': '456'}
# test2(aa=dt['aa'], bb=dt['bb'])
# 与上面等价,**相当于将字典中键值对转换为关键字参数的形式
# 字典的键应该与函数的参数相同才能使用
test2(**dt)
函数思考
函数调用和定义的位置是否是任意的?
不是,一定是定义在前,调用在后。
函数的名字能否相同?。
可以,语法不报错,但是后者会覆盖前者,不同位置
的调用结果不同 不建议定义函数名字相同的函数。
函数中能否定义另一个函数?
可以,定义在函数内部的函数称为内部函数,是很多高级功能实现的基础
变量的作用域
块级作用域
if True:
a = 250
# 在代码块内部定义的变量可以在代码块外部使用
# 说明没有块级作用域
print(a)
局部作用域
def test():
b = 100
test()
# 函数内部定义的变量只能在函数内使用
# 说明有局部作用域,外部使用会报错
# print(b) 这里无法使用
全局作用域
# 这个变量是定义在 外边的 可以在任何地方调用
c = 200
def show():
# 声明使用全局变量,然后就可以随意使用了
global c
# c = 100 # 这样相当于定义了新的局部变量
# 函数内部可以使用全局变量,但是不能修改
print('in func show:', c)
c = 100
show()
print(c)
nonlocal
global 使用global 声明的全局变量可以在函数内部更改
def wai():
d = 200
def nei():
# 若想修改外部函数的局部变量,需要使用nonlocal进行声明
nonlocal d
# d = 300 # 这样相当于定了局部变量
# 内部函数中可以使用外部函数的局部变量,但是不能改
# d += 100
print(d)
d += 100
nei()
print(d)
wai()
类型判断
示例:
a = 100
print(type(a))
# if type(a) == int: # 与特定的类型对比
# if type(a) == type(123): # 与已知的类型对比
if isinstance(a, int): # 使用专门的类型判断函数,是返回True,不是返回False
print(a, '是整型变量')
def test():
pass
print(type(test))
# 不能使用这种方式判断是否是函数
# print(isinstance(test, function))
# 使用专门的函数进行判断,是返回True,不是返回False
from inspect import isfunction
print(isfunction(test))
# 判断一个对象是否可以调用,能够调用的不一定都是函数
print(callable(test))
print(callable(a))