python_day3学习笔记
- set集合
python的set是一个无序不重复元素集,基本功能包括关系测试和消除重复元素. 集合对象还支持并、交、差、对称差等。
sets 支持 x in set、 len(set)、和 for x in set。作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets不支持 indexing, slicing, 或其它类序列(sequence-like)的操作。
1、运算操作
>>> x = set("hello!")
>>> y = set(['d','i','m','i','t','e'])
>>> x #把字符串转化为set,去重复了
set(['!', 'h', 'e', 'l', 'o'])
>>> y
set(['i', 'e', 'm', 'd', 't'])
>>> set(['i','e','m','d','t'])
set(['i', 'm', 'e', 'd', 't'])
>>> x & y #交
set(['e'])
>>> x | y #并
set(['!', 'e', 'd', 'i', 'h', 'm', 'l', 'o', 't'])
>>> x - y #差
set(['!', 'h', 'l', 'o'])
>>> y -x
set(['i', 'm', 'd', 't'])
>>> x ^ y #对称差:x和y的交集减去并集
set(['!', 'd', 'i', 'h', 'm', 'l', 'o', 't'])
>>>
2、基本方法
>>> x
set(['i', 'h', 'j', 'e', 't'])
>>> s = set("hi")
>>> s
set(['i', 'h'])
>>> len(x) #长度
>>> 'i' in x
True
>>> s.issubset(x) #s是否为x的子集
True
>>> y
set(['i', 'e', 'm', 'd', 't'])
>>> x.union(y) #交
set(['e', 'd', 'i', 'h', 'j', 'm', 't'])
>>> x.intersection(y) #并
set(['i', 'e', 't'])
>>> x.difference(y) #差
set(['h', 'j'])
>>> x.symmetric_difference(y) #对称差
set(['d', 'h', 'j', 'm'])
>>> s.update(x) #更新s,加上x中的元素
>>> s
set(['e', 't', 'i', 'h', 'j'])
>>> s.add(1) #增加元素
>>> s
set([1, 'e', 't', 'i', 'h', 'j'])
>>> s.remove(1) #删除已有元素,如果没有会返回异常
>>> s
set(['e', 't', 'i', 'h', 'j'])
>>> s.remove(2) Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module>
s.remove(2)
KeyError: 2
>>> s.discard(2) #如果存在元素,就删除;没有不报异常
>>> s
set(['e', 't', 'i', 'h', 'j'])
>>> s.clear() #清除set
>>> s
set([])
>>> x
set(['i', 'h', 'j', 'e', 't'])
>>> x.pop() #随机删除一元素
'i'
>>> x
set(['h', 'j', 'e', 't'])
>>> x.pop()
'h'
- 深浅拷贝
对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
1、赋值
赋值,只是创建一个变量,该变量指向原来内存地址,如:
n1 = {"k1": "yin", "k2": 123, "k3": ["laonanhai", 456]}
n2 = n1
print n2
结果如下:
{'k3': ['laonanhai', 456], 'k2': 123, 'k1': 'yin'}
2、利用切片操作和工厂方法list方法拷贝
代码场景:有一个小伙jack,tom通过切片操作拷贝jack,anny通过工厂方法拷贝jack。
>>> jack = ['jack', ['age',20]]
>>> tom = jack[:]
>>> anny = list(jack)
查看三者的不同id值:
>>> print id(jack), id(tom), id(anny)
29596368 29586816 29584200
从id值来看,三者是不同的对象。为tom和anny重新命名为各自的名称:
>>> tom[0] = 'tom'
>>> anny[0] = 'anny'
>>> print jack, tom, anny
['jack', ['age', 20]] ['tom', ['age', 20]] ['anny', ['age', 20]]
从这里来看一切正常,可是anny只有18岁,重新为anny定义岁数。
>>> anny[1][1] = 18
>>> print jack, tom, anny
['jack', ['age', 18]] ['tom', ['age', 18]] ['anny', ['age', 18]]
这时候奇怪的事情发生了,jack、tom、anny的岁数都发生了改变,都变成了18了。jack、tom、anny他们应当都是不同的对象,怎么会互相影响呢?看下jack,tom,anny的内部元素每个元素id:
>>> [id(x) for x in jack]
[3073896320L, 3073777580L]
>>> [id(x) for x in tom]
[144870744, 3073777580L]
>>> [id(x) for x in anny]
[144977344, 3073777580L]
原来jack、tom、anny的岁数元素指向的是同一个元素。修改了其中一个,当然影响其他人了。那为什么修改名称没影响呢?原来在python中字符串不可以修改,所以在为tom和anny重新命名的时候,会重新创建一个’tom’和’anny’对象,替换旧的’jack’对象。
3、浅拷贝方法
浅拷贝方法跟上述第二个例子相同,如下代码:
>>>import copy
>>> yin = copy.copy(jack)
>>> yin
['jack', ['age', 20]]
>>> print jack,tom,anny,yin
['jack', ['age', 20]] ['jack', ['age', 20]] ['jack', ['age', 20]] ['jack', ['age', 20]]
>>> tom[0] = 'tom'
>>> anny[0] = 'anny'
>>> yin[0] = 'yinjia'
>>> print jack,tom,anny,yin
['jack', ['age', 20]] ['tom', ['age', 20]] ['anny', ['age', 20]] ['yinjia', ['age', 20]]
>>> anny[1][1] = 18
>>> print jack,tom,anny,yin
['jack', ['age', 18]] ['tom', ['age', 18]] ['anny', ['age', 18]] ['yinjia', ['age', 18]]
4、深拷贝方法
为了让他们之间不互相影响,用deepcopy深拷贝来试试。
>>> jack = ['jack', ['age', '']]
>>> import copy
>>> tom = copy.deepcopy(jack)
>>> anny = copy.deepcopy(jack)
根据上述第二个例子思路进行重命名,重定岁数操作:
>>> tom[0] = 'tom'
>>> anny[0] = 'anny'
>>> print jack, tom, anny
['jack', ['age', '']] ['tom', ['age', '']] ['anny', ['age', '']]
>>> anny[1][1] = 18
>>> print jack, tom, anny
['jack', ['age', '']] ['tom', ['age', '']] ['anny', ['age', 18]]
这时候他们之间就不会互相影响了。打印出每个人的内部元素每个id:
>>> [id(x) for x in jack]
[139132064, 3073507244L]
>>> [id(x) for x in tom]
[139137464, 139132204]
>>> [id(x) for x in anny]
[139141632, 139157548]
他们的内部元素也都指向了不同的对象。
- 参数
下面简述普通参数、指定参数、默认参数、动态参数的区别以及举例说明。
'''
普通参数:以正确的顺序传入函数,调用时数量必须和声明的一样。
指定参数:参数和函数调用关系密切,函数调用使用使用关键字参数来确定传入的参数值,参数允许函数调用时参数的顺序和声明时不一致。
默认参数:函数进行调用时,如果没有新的参数传入则默认的情况下,就调用默认参数
动态参数:个函数能处理比当初声明时更多的参数,这些参数叫动态参数
''' # 普通参数就是函数传入的参数一样,传入函数,没有默认值
def f(a):
a += 1
return a
b = f(3)
print(b) ''' 指定参数 '''
# 如果没有指定参数的值那么就会按照顺序分别给a,b,c赋初始值
def f(x,y,z):
print('z=',z,'y=',y,'x=',x)
a = x + y + z
return a
d = f(3,4,5)
print(d)
# 如果像这样指定a,b,c的值,那么它们就是指定参数,可以不按照它们原来的顺序传入
def f(a,b,c):
print('a=',a,'b=',b,'c=',c)
z = a + b + c
return z
e = f(c=5,b=4,a=3)
print(e) ''' 默认参数 '''
# 在括号里指定b的初始值,那么b就成为默认参数
def f(a,b = 9):
sum = a + b
return(sum)
# 我们只传入一个参数3,它就会默认按照顺序赋值给第一个变量a,b就等于原来的默认值9
c = f(3)
print(c)
#当传入两个参数时,按照顺序分别赋值给a,b,那么a=3,b=4,b被重新赋值了
d = f(3,4)
print(d) ''' 动态参数 '''
# 动态参数 *args是指当我们需要传入多个参数时,可以用*args代表多个参数,不用分别在括号里指定多个参数
def f(*args):
print(args,type(args)) d = f(1,2,3) 或 d = f(*[1,2,3]) #动态参数 **kwargs, 当我们需要传入键值对类型的参数时就可以用**kwargs
def f(**kwargs):
print (kwargs,type(kwargs)) c = f(a = 3,b = 4) 或 c = f(**{'a':3,'b':4}) #动态参数之参数的万能模式,这样我们无论怎么传参数几乎都不会报错
def f(a,*args,**kwargs):
print(a,args,type(args),kwargs,type(kwargs)) e = f(22,33,44,k1 = 55,k2 = 66)
代码运行结果如下:
4
z= 5 y= 4 x= 3
12
a= 3 b= 4 c= 5
12
12
7
(1, 2, 3) <class 'tuple'>
{'b': 4, 'a': 3} <class 'dict'>
22 (33, 44) <class 'tuple'> {'k1': 55, 'k2': 66} <class 'dict'>
python_day3学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
随机推荐
- [Leetcode] pascals triangle ii 帕斯卡三角
Given an index k, return the k th row of the Pascal's triangle. For example, given k = 3,Return[1,3, ...
- ContestHunter暑假欢乐赛 SRM 09(TJM大傻逼选手再创佳绩)
T1 f[i]为前i页最少被撕几页,用二分转移就行了,答案为ans=min(f[i]+(n-i)); 不知道为什么写挂了嗯 二分的l初始应该是0 T2 数位DP f[i][1/0][1/0][1/0] ...
- 开发系统级应用不被Kill
一.设置方法 (1) 在AndroidManifest中application根节点下,添加如下代码: android:persistent="true" (2) 将应用程序pus ...
- Android数据库资料
一.联系人和通话记录: 数据库文件/data/data/com.android.providers.contacts/databases/contacts2.db 通话记录的数据存在calls表中; ...
- 题解【luoguP1525 NOIp提高组2010 关押罪犯】
题目链接 题解 算法: 一个经典的并查集 但是需要用一点贪心的思想 做法: 先将给的冲突们按冲突值从大到小进行排序(这很显然) 然后一个一个的遍历它们 如果发现其中的一个冲突里的两个人在同一个集合里, ...
- Bigbluebutton服务执行过程及相关配置文件
BigBlueButton服务列表 BigBlueButton由许多开源的服务组成,看似很麻烦,实际上拆分开每一个服务就很简单了,组件化平台化.究竟BBB都用到了哪些开源服务?我们来列举一下,名称均带 ...
- (转)史上最好的Python线程指南
来自AstalWind的好文,彻底认识python线程 http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html . . . . .
- JAVA有关命名规范
包名: xxxyyyzzz 全小写 类名/接口名:XxxYyyZzz 所有单词首字母大写,其他小写 方法名: xxxYyyZzz第一个单词首字母小写,其他单词首字母大写 ...
- 【设计模式】 模式PK:装饰模式VS适配器模式
1.概述 装饰模式和适配器模式在通用类图上没有太多的相似点,差别比较大,但是它们的功能有相似的地方:都是包装作用,都是通过委托方式实现其功能.不同点是:装饰模式包装的是自己的兄弟类,隶属于同一个家族( ...
- VM 脚本回快照和开关机
#Import PowerCLI*Get-Module -ListAvailable PowerCLI* | Import-Module #Resolve login issueSet-PowerCL ...