- A+
一、函数
1.介绍
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段,所以我经常说函数是程序员规模化使用的基础。
函数能提高应用的模块性,和代码的重复利用率。在程序设计中,常将一些常用的功能模块编写成函数,放在函数库中供公共选用。善于利用函数,可以减少重复编写程序段的工作量。
2.定义
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
语法:
1 2 3 4 5 6 7 8 9 |
#定义一个函数 def hello() : #没有参数 print("Hello World!") #调用函数 hello() #定义一个函数 def helloN(name) : #有参数 print("Hello World!", name) #调用函数 helloN('neo') |
3.函数参数 默认值
文档
1 2 3 4 5 |
def test1(): #"测试函数" print("test1.....") test1() print(test1.__doc__) help(test1) |
默认值
1 2 3 4 5 6 7 8 9 10 11 |
def test1(name,address="山西"): print(name,address) test1("张三","北京") test1("张三") #关键参数: def test2(x,y,z): print(x,y,z) test2(1,2,3) test2(z=3,x=1,y=2) # test2(1,2,z=3) # test2(z=3,1,2) |
4.参数:实参 形参
形式变量:只有在被调用时彩分批内存单元,在调用结束时,即可释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能使用该形参变量
实参:可以是常量、变量、表达式、函数等,无论实参是任何类型的变量,再进行函数调用
时,它们必须有确定的值,以便把这些值传递给形参。因此应预先用赋值,输入等办法使参
数获得确定值
5.局部和全局
局部和全局变量
当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,
即变量名称对于函数来说是局部的。这称为变量的作用域。
1 2 3 4 5 6 7 |
def test1(x): print("传入x:",x) x=100 print("修改后:",x) x=1 test1(x) print("外部x:",x) |
Global:如果你想要为已定义在函数外的变量赋值,可以使用global 修饰变量
1 2 3 4 5 6 7 |
def test1(): global x print("传入x:",x) x=100 print("修改后:",x) x=1 test1() print("外部x:",x) |
二、列表 拷贝 深 浅
直接赋值:其实就是对象的引用(别名)。
=赋值:
1 2 3 4 5 |
str1="abc" str2=str1; print(id(str1),id(str2)) print(str1==str2) print(str1 is str2) |
拷贝:复制一份,方便后期操作,或者备份
1.浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
list1=[1,2,3,["a","b","c"]] print(list1) list2=list1.copy(); print(list2) print(id(list1),id(list2)) print("修改操作") list1[3][0]="aaaa" list1[0]=111 print(list1) print(list2) [1, 2, 3, ['a', 'b', 'c']] [1, 2, 3, ['a', 'b', 'c']] #19940648 20067592 |
1 2 3 |
[1, 2, 3, ['a', 'b', 'c']] [1, 2, 3, ['a', 'b', 'c']] #19940648 20067592 |
修改操作
1 2 |
[111, 2, 3, ['aaaa', 'b', 'c']] [1, 2, 3, ['aaaa', 'b', 'c']] |
2.深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import copy list1=[1,2,3,["a","b","c"]] print(list1) list2=copy.deepcopy(list1) print(list2) print(id(list1),id(list2)) print("修改操作") list1[3][0]="aaaa" list1[0]=111 print(list1) print(list2) [1, 2, 3, ['a', 'b', 'c']] [1, 2, 3, ['a', 'b', 'c']] 50921992 50921896 修改操作 [111, 2, 3, ['aaaa', 'b', 'c']] [1, 2, 3, ['a', 'b', 'c']] |
3.进一步深度学习(浅拷贝 和 深拷贝):
不可变数据(3个):
Number(数字)
String(字符串)
Tuple(元组)
可变数据(3个):
List(列表)
Dictionary(字典)
Set(集合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) #浅 print(id(a),id(copy_a)) # 内存地址相同 a = [1,2] # 可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) # 内存地址不相同 # ‐‐ 浅拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.deepcopy(a) #深 print(id(a),id(copy_a)) # 内存地址相同 a = [1,2] # 可变数据类型 copy_a = copy.deepcopy(a) print(id(a),id(copy_a)) # 内存地址不相同 |
总结:
不管深拷贝还是浅拷贝对不可变数据类型都是引用内存地址
不管深拷贝还是浅拷贝对可变数据类型都是会重新创建新的内存空间
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫