码迷,mamicode.com
首页 > 编程语言 > 详细

python3自动化学习03

时间:2018-06-14 15:11:39      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:拷贝   style   lex   查看   jin   pen   set   cat   八进制   

概要:深浅拷贝、函数、lambda、内置函数、文件操作

一、深浅拷贝

1.对于字符串、数字来说,赋值、深拷贝、浅拷贝的结果是一样的,都是用的内存中的同一个地址。

如下图所示:

技术分享图片

技术分享图片
 1 import copy
 2 ‘‘‘
 3 
 4 a1 = 123
 5 a2 = 123
 6 #a2 = a1
 7 print(id(a1))
 8 print(id(a2))
 9 #浅拷贝,内存中的地址一样
10 a3 = copy.copy(a1)
11 print(id(a1))
12 print(id(a3))
13 #深拷贝,内存中地址一样
14 a4 = copy.deepcopy(a1)
15 print(id(a1))
16 print(id(a4))
17 #结论:对于字符串、数字来说,赋值,深浅拷贝用的都是内存中的同一个地址。
View Code

 

2.其他类型,如列表、字典、元组

对于字典、元组、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的

赋值:只是新创建了一个变量,该变量还是指向原来的内存地址

n1 = {‘k1‘:‘v1‘,‘k2‘:123,‘k3‘:["alex",678]}

n2 = n1

技术分享图片

浅拷贝:在内存地址里只拷贝一层,字典里的元素没拷贝

技术分享图片

深拷贝:有多少层拷贝多少份,在内存中将所有的数据重新创建一份

技术分享图片

技术分享图片
 1 #!/usr/bin/env python3
 2 #author:Alnk
 3 import copy
 4 
 5 #其他,如元组,列表,字典...
 6 n1 = {k1:v1,k2:123,k3:["alex",678]}
 7 
 8 #赋值 --内存地址还是一样的
 9 n2 = n1
10 print(id(n1))
11 print(id(n2))
12 
13 #浅拷贝:在内存中只额外创建第一层数据
14 #第一层的内存地址已经不一样了
15 n3 = copy.copy(n1)
16 print(id(n1))
17 print(id(n3))
18 #其他层的内存地址是一样的
19 
20 
21 #深拷贝:在内存中将所有的数据重新创建一份。更改拷贝后的数据,原来的数据不会收到影响
22 n4 = copy.deepcopy(n1)
23 print(id(n1))
24 print(id(n4))
25 #
26 print(id(n1[k1]))
27 print(id(n4[k1]))
28 print(id(n1[k2]))
29 print(id(n4[k2]))
30 print(id(n1[k3]))
31 print(id(n4[k3]))
32 print(id(n1[k3][0]))
33 print(id(n4[k3][0]))
View Code
技术分享图片
 1 import copy
 2 
 3 #示例
 4 #监控模版
 5 #已经被监控的10台机器当CPU超过80时报警,现在要新添加10台机器的监控,CPU超过60就报警
 6 dic = {
 7     "cpu":[80,],
 8     "mem":[80,],
 9     "dis":[80,]
10 }
11 
12 ###如果用赋值的话则会把原来老的监控指标也更改了###
13 new_dic = dic
14 new_dic[cpu][0] = 60
15 print("old:",dic)
16 print("new:",new_dic)
17 ###################################################
18 
19 ####如果用浅拷贝的话则会把原来老的监控指标也更改了####
20 new_dic = copy.copy(dic)
21 new_dic[cpu][0] = 60
22 print("old:",dic)
23 print("new:",new_dic)
24 ###################################################
25 
26 #####深拷贝不会更改原来老的监控指标#####
27 new_dic = copy.deepcopy(dic)
28 new_dic[cpu][0] = 60
29 print("old:",dic)
30 print("new:",new_dic)
31 ###################################################
深浅拷贝练习

 

二、函数

1.基本概念

技术分享图片
 1 #!/usr/bin/env python3
 2 #author:Alnk
 3 
 4 def mail():
 5     n = 123
 6     n+=1
 7     print(n)
 8 
 9 #调用函数
10 mail()
11 
12 #赋值 ,f 指向了mail函数的内存地址
13 f = mail
14 #调用
15 f()
View Code

2.函数返回值

  函数如果没有return,那么默认返回None

  return作用:

    返回一个值

    中断函数

技术分享图片
 1 #!/usr/bin/env python3
 2 #author:Alnk
 3 ‘‘‘
 4 #函数返回值练习(函数默认返回值为None)
 5 def mail():
 6     n = 123
 7     n+=1
 8     return 123
 9 
10 #执行函数,并且赋值给ret,拿到返回值
11 ret = mail()
12 print(ret)
13 ‘‘‘
14 
15 #return 返回一个值并且中断函数操作
16 def show():
17     print(a)
18     return [11,22]
19     print(b)
20 ret = show()
21 print(ret)
View Code

扩展:pycharm断点调试的方法

技术分享图片

3.函数参数

函数参数可分为:

  普通参数(又叫位置参数)

  默认参数 #注意默认参数必须指向不可变对象!

  动态参数:

    可变参数  #调用的时候需要先组装出一个list或tuple

    关键字参数  #关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict

    命名关键字参数

在Python中定义函数,可以用位置参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:位置参数、默认参数、可变参数、命名关键字参数和关键字参数。

技术分享图片
 1 #!/usr/bin/env python3
 2 #author:Alnk
 3 ‘‘‘
 4 #1.没有参数
 5 def show():
 6     pass
 7 
 8 
 9 #2.位置参数 :一个参数
10 def show(arg):
11     print(arg)
12 show(‘kkkk‘)
13 #两个参数,或者多个参数
14 def show(arg1,arg2):
15     print(arg1,arg2)
16 show(‘kkkk‘,‘bbbb‘)
17 
18 
19 #3.默认参数   -- 定义默认参数要牢记一点:默认参数必须指向不变对象!
20 def show(a1,a2=333):
21     print(a1)
22     print(a2)
23 show(‘aaa‘)
24 show(‘aaa‘,‘bbb‘)
25 #指定参数
26 def show(a1,a2):
27     print(a1)
28     print(a2)
29 show(a2=123,a1=999)
30 
31 
32 #4.动态参数(可变参数)--生成一个元组
33 def show(arg):
34     print(arg)
35 def show2(*arg):
36     print(arg,type(arg))
37 show(1)
38 show2(1)
39 show2(1,2,3,4,5)
40 
41 #动态参数(关键字参数) --生成一个字典
42 def show3(**kw):
43     print(kw,type(kw))
44 show3(a1=8)
45 show3(a1=8,a2=88)
46 #可变参数+关键字参数 --*args在前,**kw在后
47 def show(*args,**kw):
48     print(args,type(args))
49     print(kw,type(kw))
50 l = [11,22,33]
51 d = {"n1":66,"a1":99}
52 #show(11,222,333,44,a="bb",n3="cc")  #传参数时注意位置
53 show(l,d)  #都放进*args里面去了
54 show(*l,**d) #把列表或元组整个赋值给动态参数,需要加 * 或者 **
55 
56 #动态参数(命名关键字参数)
57 #对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw检查。
58 #如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下
59 #和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
60 def person(name, age, *, city, job):
61     print(name, age, city, job)
62 person(‘Jack‘, 24, city=‘Beijing‘, job=‘Engineer‘)
63 person(‘Jack‘, 24, job=‘Beijing‘, city=‘Engineer‘)
64 #如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了
65 def person(name, age, *args, city, job):
66     print(name, age, args, city, job)
67 #person(‘Jack‘, 24, ‘Beijing‘, ‘Engineer‘)   #调用失败
68 
69 
70 #格式化
71 s1 = "{0} is {1}"
72 l = ["alnk","shuaiguo"]
73 #result = s1.format("alnk","shuaiguo")
74 result = s1.format(*l)
75 #print(s1.format("alnk","shuaiguo"))
76 print(result)
77 
78 s1 = "{name} is {acter}"
79 result = s1.format(name="alnk",acter="666")
80 print(result)
81 d = {"name":"alnk","acter":666}
82 result = s1.format(**d)
83 print(result)
84 ‘‘‘
代码演示

  

三、lambad

技术分享图片
 1 #!/usr/bin/env python3
 2 #author:Alnk
 3 
 4 def f1(a):
 5     b = a + 1
 6     return b
 7 ret = f1(4)
 8 print(ret)
 9 
10 #lambda表达式  --简单的函数表式方式
11 f2 = lambda a:a+1   #创建了形式参数a,创建了函数内容 a+1 ,并且把结果return
12 ret = f2(99)
13 print(ret)
View Code

 

四、内置函数

目前熟悉下图标注的函数即可

技术分享图片

技术分享图片
  1 #!/usr/bin/env python3
  2 #author:Alnk
  3 ‘‘‘
  4 #abs() --绝对值
  5 print(abs(11))
  6 print(abs(-11))
  7 
  8 #all() --传一个序列,会去循环该序列,一旦存在假的值就会返回False
  9 print(all([]))
 10 print(all(["",]))
 11 print(all([0,1,2]))
 12 #以下都为假,空的类型
 13 print(bool(None))
 14 print(bool(""))
 15 print(bool([]))
 16 print(bool(0))
 17 print(bool({}))
 18 
 19 #any() --只要有一个为真,就返回True
 20 print(any([0,1,2]))
 21 
 22 #bin() --返回二进制
 23 print(bin(100))
 24 
 25 #bool() --布尔值
 26 print(bool(None))
 27 print(bool(""))
 28 print(bool([]))
 29 print(bool(0))
 30 print(bool({}))
 31 print(bool(1))
 32 
 33 #chr() --把字符转为ascii码
 34 print(ord(‘a‘))
 35 
 36 #ord() --把ascii码转为字符,
 37 print(chr(97))
 38 
 39 #dict() --创建一个字典
 40 a =dict(v1=‘k1‘,v2=‘k2‘)
 41 print(a)
 42 
 43 #dir() --当前变量所有的方法
 44 a = ()
 45 print(dir(a))
 46 
 47 #divmod() --返回一个元组,第一个元素位商,第二个元素位余数
 48 print(divmod(4,2))
 49 
 50 #enumerate() --输出编号
 51 li = ["a","b","c"]
 52 for i,item in enumerate(li,1):
 53     print(i,item)
 54 
 55 #eval() --字符串里的数字乘积
 56 print(eval("6*8"))
 57 
 58 #filter() --用于过滤序列
 59 li = [11,22,33,44]
 60 def fun(x):
 61     if x > 33:
 62         return True
 63     else:
 64         return False
 65 l = filter(fun,li) #过滤
 66 print(list(l))
 67 
 68 #map() --加工
 69 li = [11,22,33,44]
 70 new_li = map(lambda x:x+100,li)
 71 l = list(new_li)
 72 print(l)
 73 
 74 #float() --创建小数
 75 a = 1
 76 b = float(a)
 77 print(b)
 78 
 79 #help() --帮助函数
 80 
 81 #id() --查看对象在内存中的地址
 82 
 83 #input() --输入函数
 84 
 85 #int() --创建一个整数
 86 
 87 #len() --判断一个对象的长度
 88 l1 = [1,23,44]
 89 print(len(l1))
 90 s1 = "str1"
 91 print(len(s1))
 92 
 93 #list() --创建一个列表
 94 a = list((1,2,3,4))
 95 print(a)
 96 
 97 #max() --返回最大值
 98 print(max(1,2,3,4))
 99 
100 #min() --返回最小值
101 print(min(1,2,3,4))
102 
103 #oct() --八进制
104 print(oct(10))
105 
106 #pow() --返回(x的y次方) 的值。
107 print(pow(2,5))
108 
109 #range() --返回一个序列
110 print(range(1,10))
111 
112 #reversed() --反转迭代
113 l1 = [‘a‘,‘b‘,‘c‘]
114 l2 = reversed(l1)
115 for i in l2:
116     print(i)
117 
118 #round()  --四舍五入
119 print(round(8.9))
120 print(round(8.4))
121 
122 #set() --集合
123 a = set([1,2,3])
124 print(a)
125 
126 #sort() --排序
127 a = [‘b‘,‘c‘,‘a‘]
128 a.sort()
129 print(a)
130 
131 #str() --创建一个字符串
132 a = str("abcde")
133 print(a)
134 
135 #sum() --求和
136 print(sum([1,2,3],3))
137 print(sum([1,2]))
138 
139 #tuple() --元组
140 t = tuple([1,2,3,])
141 print(t)
142 
143 #type() --返回对象的类型
144 a = 1
145 print(type(a))
146 
147 #vars() --返回对象的属性和属性值的字典对象
148 class fo():
149     a = 1
150 print(vars(fo))
151 
152 #zip()  --映射
153 x = [1,2,3]
154 y = [4,5,6]
155 z = [7,8,9]
156 zipped = zip(x,y,z)
157 print(list(zipped))
158 ‘‘‘
View Code

 

 五、文件操作(open()函数)

技术分享图片
 1 #!/usr/bin/env python3
 2 #author:Alnk
 3 ‘‘‘
 4 #read 按照字符来读的
 5 f = open(‘log.txt‘,‘r‘,encoding=‘utf-8‘)
 6 ret = f.read(2)  #按照字符读,不是按照字节
 7 f.close()
 8 print(ret)
 9 
10 #tell() --查看当前指针的位置,按照字节来的
11 f = open(‘log.txt‘,‘r‘,encoding=‘utf-8‘)
12 f.read(2)
13 print(f.tell())  #按照字节,不是字符
14 f.close()
15 
16 #seek --用来指定指针的位置,按照字节来的
17 f = open(‘log.txt‘,‘r‘,encoding=‘utf-8‘)
18 f.seek(3)
19 print(f.read())  #不加参数,全部读取,加参数,指定读取字符。是字符字符字符。。。
20 f.close()
21 
22 #truncate()  --截取指针前面的字节,并且删除指针后面的数据
23 f = open(‘log.txt‘,‘r+‘,encoding=‘utf-8‘)
24 f.seek(3)
25 #print(f.read())
26 print(f.truncate())
27 f.close()
28 ‘‘‘
View Code

 

python3自动化学习03

标签:拷贝   style   lex   查看   jin   pen   set   cat   八进制   

原文地址:https://www.cnblogs.com/lichengguo/p/9181987.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!