python-函数
将代码的某个功能封装到一个参数中,使其变成一个‘工具’-----函数
定义
用def关键字来定义函数,和变量一样每个函数也有一个响亮的名字,而且命名规则跟变量的命名规则是一致的。
def hello():
print('python')
print('hello')
调用
通过函数名来调用函数
def westos():
print('it is westos')
def python():
print('is python')
python()
##函数也可也嵌套
westos()
参数
定义函数的时候的变量 叫形参(名字任意)
真实的数据信息,掉用函数的时候 传递 叫实参
形参
形参:位置参数 默认参数 可变参数 关键字参数
位置参数
形参和实参必须保持一致
def getinfo(name,age):
print('姓名:',name,'年龄:',age)
getinfo('westos',11)
getinfo(11,'westos') ##会按用户输入信息依次录入信息
getinfo(age=11,name='westos') ##此时直接说明变量的值咋不会误录
默认参数
def mypow(x,y=2):
print(x ** y)
mypow(2,3)
mypow(2)
##在用户未输入第二个值时,默认取2
可变参数(列表,集合)
def mysum(*a):
print(*a)
print(a)
sum = 0
for item in a:
sum += item
print(sum)
mysum(1,2,3,4,5)
##参数解包:在参数名前加*
nums = [1,2,3,4]
*nums:1 2 3 4
关键字参数(字典)
def getinfo(name,age,**k):
print(name)
print(age)
print(k)
d = dict(a=1,b=2)
print(*d) ##*d:12
**d:{'a': 1, 'b': 2}
##字典的解包
getinfo('westos',12,**d)
返回值
函数运算的结果,还需要进一步操作,给函数一个返回值.
return用来返回函数执行的结果,如果函数没有返回值,默认返回None.
一旦遇到return 函数执行结束,后面的代码不会执行.
多个返回值的时候,python会帮我们封装成一个元组类型.
def mypow(x,y=2):
return x**y,x+y
print(mypow(5,2))
作用域
python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了
global:声明全局变量
修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字
a = 1
print(‘outside:’,id(a))
def fun():
global a #声明a为全局变量
a = 5
print('inside:',id(a))
fun()
print(a)
print(id(a))
is和==的区别
id():在内存中存储的位置
type():变量的类型
value:值
==:type value
is:type value id
深拷贝和浅拷贝的区别
当一个变量a=x的时候 约定为:指向一个地址的过程
浅拷贝:copy.copy()
深拷贝:copy.deepcopy()
他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别
深拷贝和浅拷贝需要注意的地方就是可变元素的拷贝
什么是可变对象,什么是不可变对象:
可变对象是指,一个对象在不改变其所指向的地址的前提下,可以修改其所指向的地址中的值;
不可变对象是指,一个对象所指向的地址上值是不能修改的,如果你修改了这个对象的值,那么它指向的地址就改变了,相当于你把这个对象指向的值复制出来一份,然后做了修改后存到另一个地址上了,但是可变对象就不会做这样的动作,而是直接在对象所指的地址上把值给改变了,而这个对象依然指向这个地址。
深拷贝就是完全跟以前就没有任何关系了,原来的对象怎么改都不会影响当前对象
浅拷贝,原对象的list元素改变的话会改变当前对象,如果当前对象中list元素改变了,也同样会影响原对象。
如果 copy.copy()拷贝的是元组 那么它不会进行浅拷贝 仅仅是指向
因为元组是不可变数据类型,意味着数据一定不能修改
因此它会自动判断为指向