文章目录:
5.1 深浅拷贝
5.1.1 浅拷贝
5.1.2 深拷贝
5.2 集合set
5.2.1 更新set集合_添加
5.2.2 update
5.2.3 remove, pop, clear, del
5.2.4 交集,并集
5.2.5 差集, 对称差集
5.2.6 超集,子集
5.3 函数:
5.3.1、概念
5.3.2、创建
5.3.3、参数
5.3.4、函数的reture
5.3.5、定义域
# 符号说明
() #元组 用法: (‘xx‘,‘yy‘) 不可修改
[] #列表 用法: [‘xx‘,‘yy‘] 可修改,列表必须是可hash的,列表与字典是不可hash的
列表创建: a=[1,2]
b=list([1,2])
{} #字典 用法: {‘xx‘:‘yy‘,(‘zz‘:‘dd‘)} 可修改字段
5.1 深浅拷贝
5.1.1 浅拷 = 相当于软链接
# 变量中列表就相当于文件,int与str就相当于是一个目录,
# (软链接可以将目录名称更称不会修改文件本身,但如果修改文件那么A跟B就会同时修改)。
a = [[1,2],3,4]
print(a)
打印: [[1, 2], 3, 4]
b = a.copy()
b[1]=321
print(b)
打印结果为: [[1, 2], 321, 4] # 软链接目录名称改了也不会影响原来的目录
print(a)
打印结果为: [[1, 2], 3, 4] # b修改a不修改也就正常了
# 但如果是修改变量中的列表时,它会修改内存中指的值,a跟b会同时修改
b[0][1] = 234
print(b)
print(id(b[0][1])) # 打印结果为: 1388964880 两个内存结果都一样
print(a)
打印结果为: [[1, 234], 321, 4] # 改了软链接中文件,那么2个文件都会同时更称
[[1, 234], 3, 4]
print(id(a[0][1])) # 打印结果为: 1388964880
# 相当于一个链接的文件,修改b也相当于修改a了
5.1.2 深拷贝 = 完整克隆
变量 = copy.deepcopy(要复制的变量) # 完整克隆一个数据
5.2 set
set: 把不同的元素组成一起形成集合,是py基本的数据类型
# 去重功能,当有两个相同的元素的时候会去掉重复的字符串
# 必须是可hash的字符串,set是无序的,只能通过循环遍历或使用in、not in来访问或判断集合元素
# set 不能做为键
5.2.1 更新set集合_添加
a = ["a","b"]
c=set(a)
c.add("c")
print(c) 结果: {‘b‘, ‘a‘, ‘c‘}
5.2.2 update
c.update("ab1")
print(c) 结果: {‘b‘, ‘1‘, ‘a‘, ‘c‘}
# ab1 做为一个序列添加,有重复的不会添加序列, 没有重复的会直接添加到列表中
c.update([123,321]) # 当为列表时,它会将序列当成一个整体加入到变量中,有重复的也不会添加
print(c) # {321, ‘b‘, ‘a‘, 123}
5.2.3 remove, pop, clear, del
c.remove("a") 结果: {‘b‘, ‘1‘, ‘c‘}
c.pop() 结果: 随机删除一个
c.clear() # 结果: 清空列表 返回 set()
del c # 直接删除变量,打印报错因为已经没了
5.2.4 交集,并集
a=set([1,2,3,4,5])
b=set([1,2,3,4,6])
交集: print( a & b) # {1, 2, 3, 4}
并集: print( a | b) # {1, 2, 3, 4, 5, 6}
5.2.5 差集, 对称差集
差集: print(a.difference(b)) in a but bot b # A有的B没有的打印出来
第二种方法: print (a-b)
# {5} 反过来也一样
对称差集: print(a.symmetric_difference(b)) AB有的都不打印,只打印它共同没有的字符串或数值
第二种方法: print ( a^b )
# {5, 6}
5.2.6 超集,子集
print(a.issuperset(b)) # A是不是完全包含B,否 返回 False 相当于A>B
print(a.issubset(b)) # A是不是B的子集 相当于A<B
name1=set(["xiong","wei","hua","fa"])
name2=set(["xiong","yua","yuan","hua"])
# 子集 # 判断两个字段是否相等
print(name1<name2) # False
# 父集 # 判断两个字段是否相等
print(name1>name2) # False
# 并集 # 打印去重之后的
print(name1 | name2) # {‘hua‘, ‘xiong‘, ‘yuan‘, ‘wei‘, ‘fa‘, ‘yua‘}
# 交集 # 共同有的
print( name1 & name2 ) # {‘hua‘, ‘xiong‘}
# 差集 # 用集合1减去集合2的相同字段,取出与集合2不相关的
print( name1 - name2 ) # {‘wei‘, ‘fa‘}
# 对称差集 # 取出A跟B有的,打印两个集合没有的字符串
print( name1 ^ name2 ) # {‘yuan‘, ‘yua‘, ‘fa‘, ‘wei‘}
# 手动输入一些字符串与自行定义的字符串进行对比
ins=[] b=set([‘1‘,‘2‘,‘3‘,‘4‘,‘5‘]) while True: a=input("测试: ") if a == "q": break ins.append(a) ins=set(ins) print(ins > b )
5.3 函数:
5.3.1、概念
作用:
1、减少重复代码
2、方便修改,易扩展
3、保持代码一致性
命名规则
函数名必须是下划线或字母开头, 可以包含任意字母、数字或下划线的组合, 不能使用任何标点符号
函数名是不区分大小写的;
函数名不能是保留字。
5.3.2、创建
def f(): # def是define简称 f()表示函数名 ()可以用来传递参数
print (" hello world ") # 函数体,下面所有代码都属于 f 这个函数
f() # 调用函数, 不加(), 直接用f那么它就表示成了一个变量
5.3.3、参数
# 注意:1、形参有多少个,实参就得定义多少个
2、调用时候需要严格区分大小写
3、默写参数一定要跟在其它参数后面
4、不定长参数, 固定格式: (*args无命名参数放左边,**kwargs 有命名参数放右边),如果有默认参数放左边
# 必须参数(关键字参数): 必须参数以正确顺序传入函数,调用时的数量必须和声明时的一样
def add(x,y): # add(x,y) 形参
print (x+y)
def(3,5) # 实参
def test1(name,age):
print("Name: %s" % name )
print("Age: %d" % age )
test1("xiong",123)
打印结果: Name: xiong
Age: 123
# 默认参数:
def test1(name,age,sex="man"):
print("Name: %s" % name )
print("Age: %d" % age )
print("Sex: %s " % sex )
test1("xiong",123)
打印结果: Name: xiong
Age: 123
Sex: man
# 不定长参数:(*args) # args可以自行命名 *表示不定长参数
(*arges): 无命名参数 # 保存至args时为元组
(**kwargs): 有命名参数 # 保存至kwargs时为字典
def test2(*args): print(args) test2(1,2,3,4,5,6) # 打印结果为: (1, 2, 3, 4, 5, 6)
##################### 示例2 #####################
def test3(**kwargs): print(kwargs) test3(name="xiong",age=123,sex="man") # 打印结果: {‘name‘: ‘xiong‘, ‘age‘: 123, ‘sex‘: ‘man‘}
##################### 示例3 #####################
def test3(**kwargs): for te in kwargs: print(te,":",kwargs[te]) test3(name="xiong",age=123,sex="man") # 打印结果: name : xiong age : 123 sex : man
##################### 示例4 #####################
def test4(*args,**kwargs): print(args,kwargs) test4(1,2,3,4,name="xiong",age=123,sex="man") # 打印结果: (1, 2, 3, 4) {‘name‘: ‘xiong‘, ‘age‘: 123, ‘sex‘: ‘man‘}
##################### 错误——示例5 #####################
def test4(name,sex="man",*args,**kwargs): print(name,sex,args,kwargs) test4(name="xiong",sex="man",1,2,3,4,age=123) # 打印结果: SyntaxError: positional argument follows keyword argument
# 优先级: def 函数名(关键参数,默认参数,无命名参数,有命名参数)
#示例 def test(te1,age=‘male‘,123,job=‘IT‘)
######### 当中间有一个默认值的时候,如果不指定它还是会打印出错,
def test4(name,sex="man",*args,**kwargs): print(name,sex,args,kwargs) test4("xiong",1,2,3,4,age=123)
5.3.4、函数的reture
作用: 1、结束函数
2、返回某个对象
注意点: 1、 函数里如果没有return,会默认返回一个None
2、 如果return有多个对象,那么python会帮我们把多个对象封装成一个元组返回
5.3.5、定义域
函数是有自己的定义域的,IF是没有的
作用域分四种情况: LEGB
L:local,局部作用域,即函数中定义的变量;
E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
G:globa,全局变量,就是模块级别定义的变量;
B:built-in,系统固定模块里面的变量,比如int, bytearray等。 搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB
外层 built-in --> global 全局作用域 --> enclosing 局部作用域 --> local 局部作用域
局部变量不能修改全局变量
局部要想改变全局变量需要增加一个global 变量
如果是在enclosing那就需要增加一个nonlocal 变量名称
模块: 取出当前时间
import time
time_format = ‘%Y-%m-%d %X‘
times = time.strftime(time_format)
print(times)
# 功能,设置一个函数时间,将其保存到测试文件中,将打印start funcation 到屏幕上
#!/usr/bin/env python # -*- coding:utf-8 -*- def logger(n): import time time_format = "%Y-%m-%d %X" times = time.strftime(time_format) with open("测试文件",‘a‘,encoding=‘utf-8‘) as f: f.write("%s funcation1 %s \n" %(times,n) ) def fun1(n): print("start funcation 1 ") logger(n) fun1(1) # 打印结果打开测试文件 2017-09-12 14:13:33 funcation1 1 # %s times %s n 函数形参的参数
# 实现不定长函数的加法
def test2(*args): number = 0 for i in args: number += i print(number) test2(1,2,3,4,5,6) # 传递一堆整型给test2函数, 保存至args是元组格式,使用for循环叠加