爱在莫斯科 发表于 2018-8-14 08:06:03

python笔记day2

  作用域
  只要内存中存在就可以使用,在有函数栈的情况下,还需要加一个条件。
  name = {'name1':'Carrick','name2','Tina'}
  for item in name:
  print item-->仅仅是打印,没有将变量指向item内存空间
  print item -->无法打印,没有变量指向item的内存空间,print不知道该打印哪个内存空间
  name = {'name1':'Carrick','name2','Tina'}
  for item in name:
  a = item
  print a-->可以打印,因为有变量a指向item的内存空间
  这个仅仅可以打印name字典的最后一个变量
  注意事项:这种for循环中赋值,仅仅可以在python中使用,在其他语言中,for循环的字典会被压入栈中,当for循环执行完毕,栈会被清空,即使a = item,因为item的内存空间被清空,a找不到内存中的位置,print a也不会成功。因此不要在python的for循环中使用赋值。
  三目运算
  三目运算是if...else结构的简写
  if a > b:
  name = 'Carrick'
  else
  name = 'Tina'
  写为三目运算:
  name = 'Carrick' if a > b else 'Tina'
  PyCharm
  PyCharm用专业版,社区版不支持Django
  PyCharm使用步骤:
  第一步:指定Python解释器
  PyCharm本身没有自带解释器,必须指定Python解释器,才能正常运行Python程序
  第二步:
  New Project --> Pure Python --> New --> Python File
  第三步:
  打断点,dubug模式运行
  run正常模式运行
  Python中一切皆对象,对象是由类创建的,对象可以调用相关类的属性和方法
  查找类提供哪些方法:
  >>> li =
  >>> type(li)-->查看li所属类型
  <type 'list'>
  >>> dir(list)-->查看类型提供哪些方法
  ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delsli
  ce__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getit
  em__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__',
  '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__r
  educe__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__'
  , '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'a
  ppend', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'
  ]
  __X__是内置方法,有至少一种执行方法,没有下划线的方法是非内置方法,只有一种执行方式
  >>> help(list.append)-->查看具体函数的使用方法
  Help on method_descriptor:
  
  append(...)
  L.append(object) -- append object to end
  PyCharm查看python方法的源码:
  敲list,按ctrl点击list,即可看到python的list的源码
  int类型常用内置方法
  int类型赋值
  方法一: i = 10
  方法二:i = int(10)
  方法三:
  >>>i = int("F",base=16)--> 16进制赋值
  >>> print i
  15
  加法
  >>> n1 = 1
  >>> n2 = 2
  >>> n1.__add__(n2)==>等价于n1 + n2
  3
  另外:
  1. 减法,乘法,除法,幂和取模等运算,只要记住n1-n2,n1*n2,n1/n2,n1**n2和n1%n2,不用记具体的函数
  2. int还有radd,add相当于n1+n2,radd相当于n2+n1,int类型还有很多r开头的函数,都是将两个数字掉个
  
  绝对值
  >>> n1 = -9
  >>> n1.__abs__()==>等价于abs(n1)
  9
  大小比较
  >>> n1 = 9
  >>> n2 = 8
  >>> n1.__cmp__(n2)==>等价于cmp(n1,n2)
  1
  返回值为1,说明n1大于n2,返回值为0,说明n1等于n2,返回值为-1,说明n1小于n2
  生成商和余数的元组 -->用于网站分页显示
  >>> n1 = 10
  >>> n2 = 3
  >>> n1.__divmod__(n2)==>等价于divmod(n1,n2)
  (3, 1)
  除法
  >>> n1 = 10
  >>> n1.__div__(3)
  3
  int类型转换为float类型
  >>> n1 = 10
  >>> type(n1)
  <type 'int'>
  >>> new_n1 = n1.__float__()==>等价于float(n1)
  >>> type(new_n1)
  <type 'float'>
  获得属性
  只有类中写有__getatrribute__属性,敲“.”才能显示出类中可用的属性
  获得哈希
  x.__hash__()==>等价于hash(x)
  爬虫中URL很长,一般将URL做hash或者md5,形成一个较短的字符串,便于存放在数据库中。
  在字典中,如果key很长,哈希值用于快速比较key的值
  获得n进制数字
  >>> n = 18
  >>> n.__hex__()==>等价于hex(n),获得十六进制数字
  '0x12'
  >>> n.__oct__()==>等价于oct(n),获得八进制数字
  '022'
  整数部分截取-->对整数无意义
  >>> n = 5.2
  >>> n.__trunc__()
  5
  long型和float型的方法和int型方法几乎一样
  str类型
  str定义
  str1 = "Carrick" 或者
  str1 = str("Carrick")
  字符串首字母大写
  >>> name = 'Carrick'
  >>> name.capitalize()
  'Carrick'
  字符串居中
  >>> name = 'Carrick'
  >>> name.center(20,"*")
  '******Carrick*******'
  查找子串的个数
  >>> name = "djkajs;kfljdaksjkds"
  >>> name.count("s")
  3
  >>> name.count("s",8,20)-->指定起始位置和结束位置
  2
  字符串结尾判断
  >>> name = 'Carrick'
  >>> name.endswith('ck')
  True
  >>> name.endswith('ck',2,)-->第二个字符到最后一个字符,以ck结尾
  True
  **将tab转换为空格
  默认情况下一个tab转换为8个空格
  将tab转换为空格,然后用strip()函数将所有空格去掉,就可以取到配置文件中的参数
  >>> name = 'Carri       ck' -->中间有tab键
  >>> name.expandtabs()
  'Carri   ck'
  >>> name.expandtabs(1)-->转换成一个空格
  'Carri ck'
  查找子串的位置:find和index
  >>> name = 'Carrick'
  >>> name.find('ri')
  3
  >>> name.find('Fairy')
  -1
  >>> name = 'Carrick'
  >>> name.index('ri')
  3
  >>> name.index('Fairy')
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  ValueError: substring not found
  >>>
  find找到返回子串第一个字符的位置,找不到返回-1;如果有相同的子串,会返回第一个子串的位置
  index找到返回子串第一个字符的位置,找不到报错
  判断字符串是否为数字或者字母
  >>> name = 'Carrick'
  >>> name.isalnum()
  True
  >>> name = '老毕'
  >>> name.isalnum()
  False
  是数字或者字符返回True,是其它值返回False
  判断字符串是否为字母
  >>> name = 'Carrick'
  >>> name.isalpha()
  True
  >>> name = 123
  >>> name.isalpha()
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  AttributeError: 'int' object has no attribute 'isalpha'
  >>>
  是字母返回True,是其它值报错
  判断字符串是否为数字
  >>> name = 123
  >>> name.isdigit()
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  AttributeError: 'int' object has no attribute 'isdigit'
  >>> name = '123'
  >>> name.isdigit()
  True
  是数字返回True,是其它值报错
  判断字符串是否全是小写
  
  >>> name = 'carrick'
  >>> name.islower()
  True
  >>> name = 'Carrick'
  >>> name.islower()
  False
  isupper() 判断字符串是否全为大写
  isspace() 判断字符串是否全为空格
  转换为标题
  >>> name = 'hello carrick'
  >>> name.istitle()
  False
  >>> name.title()
  'Hello Carrick'
  >>> name = 'Hello Carrick'
  >>> name.istitle()
  True
  istitle() 判断字符串是否标题
  >>> name = 'hello carrick'
  >>> name.istitle()
  False
  >>> name = 'Hello Carrick'
  >>> name.istitle()
  True
  标题就是每个单词首字母大写
  **字符串连接
  >>> L = ['s1','s2']
  >>> "_".join(L)
  's1_s2'
  左对齐ljust()
  >>> name = 'Carrick'
  >>> name.ljust(20,"+")
  'Carrick+++++++++++++'
  右对齐:rjust()
  大写变小写lower();小写变大写upper()
  >>> name = 'Carrick'
  >>> name.lower()
  'carrick'
  >>> name.upper()
  'CARRICK'
  大写变小写,小写变大写swapcase()
  >>> name = 'Carrick'
  >>> name.swapcase()
  'cARRICK'
  字符串分割paritition()
  >>> name = 'Carrick'
  >>> name.partition('rr')
  ('Ca', 'rr', 'ick')
  **字符替换replace()
  >>> name = 'Carrick'
  >>> name.replace('Ca','ca')
  'carrick'
  
  >>> name = 'Carrick'
  >>> name.replace('r','hhhh')
  'Cahhhhhhhhick'
  replace()会替换所有的字符,不仅仅替换第一个字符
  字符转相乘(python特有的)
  >>> name = 'Carrick'
  >>> name*6
  'CarrickCarrickCarrickCarrickCarrickCarrick'
  字符串格式化
  方法一:
  >>> name = "I am {0}, I am {1} years old."
  >>> name.format('Carrick','34')
  'I am Carrick, I am 34 years old.'
  方法二:
  >>> name = "I am {ss}, I am {dd} years old."
  >>> name.format(dd="34", ss="Carrick")
  'I am Carrick, I am 34 years old.'
  方法三:元组,列表传参,需要加“*”
  >>> L = ['Carrick',34]
  >>> name = "I am {0},aged {1}"
  >>> name.format(*L)
  'I am Carrick,aged 34'
  方法四:字典传参,需要加“**”
  >>> D = {'ss':'Carrick','dd':34}
  >>> name = "I am {ss},aged {dd}"
  >>> name.format(**D)
  'I am Carrick,aged 34'
  解码和编码

  utf-8和GBK可以通过unicode来相互转换,不可以直接转换
  >>> '无'
  '\xce\xde'
  >>> str1 = '\xce\xde'
  >>> print str1
  无
  >>> print str1.decode('gbk') -->指定从哪个编码解码
  无
  >>> print str1.decode('gbk').encode('utf-8')
  鏃
  列表的方法(二)
  列表元素出现的次数
  >>> L =
  >>> L.count(88)
  1
  >>> L.count(22)
  0
  列表扩展
  >>> L =
  >>> L.extend(['Carrick','Tina'])
  >>> L
  
  >>> L.extend(L)
  >>> L
  
  列表可以自己扩展自己
  列表元素查找
  >>> L =
  >>> L.index(66)
  0
  >>> L.index(22)
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  ValueError: 22 is not in list
  列表指定位置插入
  >>> L =
  >>> L.insert(0,88)
  >>> L
  
  删除并返回指定下标的值,不指定下标就弹出最后一个元素
  >>> L
  
  >>> L.pop()
  88
  >>> L
  
  >>> L.pop(1)
  66
  >>> L
  
  删除列表第一个值
  >>> L =
  >>> L.remove(66)
  >>> L
  
  列表翻转
  >>> L =
  >>> L.reverse()
  >>> L
  
  列表元素排序
  字母比较ASCII,中文比较Unicode,数字比较大小
  >>> '无'
  '\xce\xde'
  >>> str1 = '\xce\xde'
  >>> str1.decode('gbk')
  u'\u65e0'
  >>> str2 = u'\u65e2'
  >>> print str2
  既
  >>> li = ['无','既']
  >>> li.sort()
  >>> li
  ['\xbc\xc8', '\xce\xde']
  unicode的编码,'\xce\xde'是u'\u65e0','\xbc\xc8'是u'\u65e2',因此sort()将大的排在前面
  >>> for i in li:
  ...   print i
  ...
  既
  无
  列表元素删除
  del name是调用__delitem__()方法来执行的
  元组和列表的唯一区别,就是列表可以被修改,而元组不能被修改
  列表和元组的元素都可以是重复的
  元组的元素不能被修改,但是元组的元素的元素可以被修改
  字典的key不能重复,value可以重复
  元组方法:index(),count()
  字典
  修改字典,不会在内存中重新开辟一块空间,只有字符串会
  字符串,数字可以作为字典的key,列表不能作为字典的key,元组可以作为字典的key,但是不要这么做
  字符串,数字和类的实例当做字典的key没有问题
  字典根据key获得value
  方法一:字典中没有值会报错
  >>> d = {'k1':1234}
  >>> d['k1']
  1234
  >>> d['k2']
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  KeyError: 'k2'
  ***方法二:字典中没有值不会报错
  >>> d = {'k1':1234}
  >>> d.get('k1')
  1234
  >>> d.get('k2')
  >>> print d.get('k2')-->默认返回值
  None
  >>> print d.get('k2','OK')-->指定返回值
  OK
  判断是否为字典
  >>> d = {'k1':1234}
  >>> type(d) is dict
  True
  清空字典
  >>> D = {1:'a'}
  >>> D.clear()
  >>> D
  {}
  第一个列表作为字典的key,生成字典
  >>> D = {}
  >>> D.fromkeys(,)
  {1: , 2: , 3: }
  有时有个列表,想以列表为key生成字典,就可以
  >>> D.fromkeys(,[])
  {1: [], 2: [], 3: []}
  生成一个value为空的字典,然后往里面插入value即可
  判断key是否在字典中
  方法一
  >>> D = {1:'a'}
  >>> D.has_key(1)
  True
  方法二
  >>> 1 in D
  True
  循环字典
  方法一:数据量小的时候可以用,几万条数据之内可以用
  >>> D = {1:'a',2:'b',3:'c'}
  >>> for k,v in D.items():
  ...   print k,v
  ...
  1 a
  2 b
  3 c
  方法二:数据量大时用
  >>> for k in D:
  ...   print k,D
  ...
  1 a
  2 b
  3 c
  根据key删除字典元素
  方法一:
  >>> D = {1:'a',2:'b',3:'c'}
  >>> D.pop(2)
  'b'
  >>> D
  {1: 'a', 3: 'c'}
  方法二:
  >>> D
  {1: 'a', 3: 'c'}
  >>> del D
  >>> D
  {1: 'a'}
  随机删除字典元素:popitems(),不要使用
  根据key查找元素,如果没有就生成一个None
  >>> D = {1:'a',2:'b',3:'c'}
  >>> D.setdefault(2)
  'b'
  >>> D
  {1: 'a', 2: 'b', 3: 'c'}
  >>> D.setdefault(4)
  >>> D
  {1: 'a', 2: 'b', 3: 'c', 4: None}
  将另一个字典的元素加入到当前字典,如果有相同的key,取另一个字典的key和value(偶尔用)
  >>> C = {1:'a',2:'b',3:'c'}
  >>> D = {4:'d',5:'e',3:'f'}
  >>> C.update(D)
  >>> C
  {1: 'a', 2: 'b', 3: 'f', 4: 'd', 5: 'e'}
  字典浅copy
  >>> D = {}
  >>> for i in range(5):
  ...   D = []
  ...
  >>> D
  {0: [], 1: [], 2: [], 3: [], 4: []}
  >>> D.append({"b":1})
  >>> D
  {0: [], 1: [{'b': 1}], 2: [], 3: [], 4: []}
  >>> C = D
  >>> C
  {0: [], 1: [{'b': 1}], 2: [], 3: [], 4: []}
  >>> D
  {0: [], 1: [{'b': 1}], 2: [], 3: [], 4: []}
  >>> D['Rain'] = 'test'
  >>> D
  {0: [], 1: [{'b': 1}], 2: [], 3: [], 4: [], 'Rain': 'test'}
  >>> C
  {0: [], 1: [{'b': 1}], 2: [], 3: [], 4: [], 'Rain': 'test'}
  D修改了,C也跟这个修改;如果是字符串,D修改了,C不会随着修改
  >>> E = D.copy()
  >>> D.pop('Rain')
  'test'
  >>> D
  {0: [], 1: [{'b': 1}], 2: [], 3: [], 4: []}
  >>> E
  {0: [], 1: [{'b': 1}], 2: [], 3: [], 4: [], 'Rain': 'test'}
  >>> C
  {0: [], 1: [{'b': 1}], 2: [], 3: [], 4: []}
  如果使用copy(),E会是另外一个字典,D删除一个元素,E不会随着删除
  >>> D['b'] = 'Carrick'
  >>> D
  {0: [], 1: [{'b': 'Carrick'}], 2: [], 3: [], 4: []}
  >>> C
  {0: [], 1: [{'b': 'Carrick'}], 2: [], 3: [], 4: []}
  >>> E
  {0: [], 1: [{'b': 'Carrick'}], 2: [], 3: [], 4: [], 'Rain': 'test'}
  注意:浅copy只复制字典的第一层
  深copy:需要借助第三方模块
  >>> import copy
  >>> F = copy.deepcopy(D)
  >>> F
  {0: [], 1: [{'b': 'Carrick'}], 2: [], 3: [], 4: []}
  >>> D['b'] = 'Fairy'
  >>> D
  {0: [], 1: [{'b': 'Fairy'}], 2: [], 3: [], 4: []}
  >>> E
  {0: [], 1: [{'b': 'Fairy'}], 2: [], 3: [], 4: [], 'Rain': 'test'}
  >>> C
  {0: [], 1: [{'b': 'Fairy'}], 2: [], 3: [], 4: []}
  >>> F
  {0: [], 1: [{'b': 'Carrick'}], 2: [], 3: [], 4: []}
  集合:去重,交集,差集,并集等的运算
  集合/字典是无序的,列表/元组是有序的
  列表/字典/集合可以修改,元组不能修改
  >>> a = range(5,10)
  >>> b = range(7,12)
  >>> a
  
  >>> b
  
  >>> c = set(a)
  >>> c
  set()
  >>> a.append(6)
  >>> a
  
  >>> c
  set()
  
  >>> d = set(b)
  >>> d
  set()
  >>> c
  set()
  >>> c & d-->交集
  set()
  >>> c | d-->并集
  set()
  >>> c ^ d-->交集取反
  set()
  >>> c - d-->c有d没有的元素
  set()
  >>> d - c-->d有c没有的元素
  set()
  intersection --> &
  union --> |
  symmetric_difference --> ^
  子集和父集
  >>> e = set()
  >>> e
  set()
  >>> d
  set()
  >>> e.issubset(d)
  True
  >>> d.issuperset(e)
  True
  弹出集合第一个元素
  >>> c
  set()
  >>> c.pop()
  8
  >>> c.pop()
  9
  删除集合指定元素
  set()
  >>> c.remove(6)
  >>> c
  set()
  加入另外一个集合的元素
  >>> c = set()
  >>> f = set()
  >>> c.update(f)
  >>> c
  set()
  集合不能有重复元素
  集合使用场景:资产管理统计硬盘数量
  硬盘使用S/N号来识别,这里用1,2简单说明一下
  diskset = set()
  坏掉一块硬盘后
  diskset1 = set()
  可以发现硬盘2是坏掉的,写入到数据库中
  >>> diskset - diskset1
  set()
  增加了硬盘后:
  diskset2 = set()
  可以发现硬盘3,4,5是新增加的硬盘,写入到数据库中
  >>> diskset2 - diskset1
  set()
  
页: [1]
查看完整版本: python笔记day2