Python基础学习
- 一、函数
- 二、返回值
- 三、参数
- 四、函数嵌套
- 五、函数的默认参数
一、函数
1 将独立的代码块写进函数,重复使用
2 定义函数基本语法:
def 函数名(): # 变量的命名规范,中文可以,但不建议
函数体
3.调用函数 函数名()
二、返回值
- 返回值return
- 若return 后面为空,则返回的结果为None
- return 会给函数的执行者返回值,要打印的话需print()
- 若返回多个值,以元祖的形式返回
- 函数中遇到return ,此函数结束后此函数中的代码不执行
- return 是返回计算值,print()是打印结果
三、参数
- 形参:形式上的参数,写在函数定义位置的变量
- 实参:实际上的参数,写在函数调用的位置
- 传参:函数将实参交给形参的过程
- 1必备参数-- 写几个传几个
- 2默认参数–给某个参数指定一个默认值,若实参有值则用实参的值
- 3可变参数
传入的值是可变的,可以传多个也可以不传
*args将实参所有位置参数接收,放在一个元祖中
args是个普通的形参,’ * '具有特殊意义 - 关键字参数
**kwargs接收所有的关键字参数,然后将其转换为一个字典赋值给kwargs这个形参
kwargs是个普通的形参,’ ** ’ 具有特殊含义,约定成俗的使用kwargs
传值时,传关键字参数,即 键=值 的形式 (否则可能会报错)
def test():
num=100
return num+12,'九个老师','uxhf'
print(test()) # (100, '九个老师', 'uxhf')
def add(a,b):
return a+b
print(add(2,3)) # 5
def test1(*args):
print(args,type(args))
return args
test1() # () <class 'tuple'>>
def test2(**kwargs):
print(kwargs,type(kwargs))
return kwargs
test2() #{} <class 'dict'>
test2(a='an',b='nb')#{'a': 'an', 'b': 'nb'} <class 'dict'>
四、函数嵌套
嵌套调用 在函数a里面调用函数b
嵌套定义 在一个函数中定义另一个函数
def a():
name='外层函数'
print('a')
def b():
return name
return b
print(a())# a \n <function a.<locals>.b at 0x00000197A5E3F268>
print(a()())# a \n 外层函数
def a():
name='外层函数'
print('a')
def b():
return name
return b()
print(a())# a \n 外层函数
五、函数的默认参数
- 必选参数必须在前,默认参数在后
- 一般将参数变化值小的设置为默认参数
- 3.函数的初始化
1. 按照python的哲学:一切皆为对象
2. 函数就是 types.EunctionType 或者 其子类对象的实例化对象
3. 解释器读到函数末尾时,则对此函数完成初始化,得到一个 函数名–函数对象 的映射关系
4. id(object) 函数返回一个对象的唯一标识(唯一且不变的整数),在重叠的生命周期中,两个对象可能会有相同的 id
5. 在CPython解释器中,id(object)的值为对象的内存地址
6. 函数的默认参数为可变参数时,参数值的改变不会重建对象内存,会受前一次的影响
7. 为不可变参数时,参数值的变化会重新创建参数的内存空间,本次调用不受前次的影响
8. 要想使用可变的默认参数需在函数内部重新绑定
#重新绑定默认参数
def fun4(a,li=[]):
li=[]
li.append(a)
return li
print(fun4(2))
print(fun4(3))
#不可变的默认参数
def fun3(i=1):
print('地址:',id(i))
i+=1
print('变后的地址:',id(i))
return i
print(fun3())# 地址: 140705654625312 变后的地址: 140705448186944 2
print(fun3())# 地址: 140705654625312 变后的地址: 140705448186944 2
#默认函数参数(可变的)
def fun2(m,li=[]):
print('地址',id(li))
li.append(m)
print('变后的地址:',id(li))
return li
print(fun2(1))# 地址 1524584211976 变后的地址: 2706550242888 [1]
print(fun2(2))# 地址 1524584211976 变后的地址: 2706550242888 [1, 2]
print(fun2(3))# 地址 1524584211976 变后的地址: 2706550242888 [1, 2, 3]
# 默认参数(可变的)
import datetime as dt
from time import sleep
def date(m,time=dt.datetime.now()):
sleep(1)#线程暂停一秒
print('%s:%s'%(time.isoformat(),m))
date(1)# 2021-08-26T14:49:09.784256:1
date(2)# 2021-08-26T14:49:09.784256:2
date(3)# 2021-08-26T14:49:09.784256:3