pyhton之面向对象(class)

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

Python 区分面向对象和面向类

对象:根据模板创建的实例,通过实例对象可以执行类中的函数

类:就是一个模板,模板里可以包含多个函数,函数里实现一些功能 

#创建类

Class Foo:  #class是关键字(表示要开始创建类了);Foo是新建的类名称
Def bar(self):  #self特殊参数(必填)
pass 
Obj = Foo 

面向对象的三大特性是指:封装、继承和多态。

  • 封装

封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

class Foo:
  def __init__(self, name, age):
    self.name = name
    self.age = age

obj1 = Foo('chengd', 18) #此处的obj1就是self,“chengd”和“18”就是name和age属性
obj2 = Foo('python', 99) #此处的obj2就是self,“pyhton”和“99”就是name和age属性

调用被封装的内容时,有两种情况:

通过对象直接调用

class Foo:
   def __init__(self, name, age):
     self.name = name
     self.age = age

obj1 = Foo('chengd', 18)
Print (obj1.name)
Print (obj1.age)

通过self间接调用

class Foo:
  def __init__(self, name, age):
    self.name = name
    self.age = age
 
  def detail(self):
    print(self.name,self.age)  
obj1 = Foo('chengd', 18)
obj1.detail()  
# Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 chengd ;self.age 是 18
  • 继承

对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法

 

class Animal:

     def eat(self):
         print ("%s 吃饭 " %self.name)

 
     def drink(self):
         print ("%s 喝奶 " %self.name)
  

      def shit(self):
          print ("%s 拉 " %self.name)

  
      def pee(self):
          print ("%s 撒" %self.name)

 

class Cat(Animal):

     def __init__(self, name):
         self.name = name


    def cry(self):
         print ('%s喵喵叫'%(self.name))

 
class Dog(Animal):

     

     def __init__(self, name):
          self.name = name       

     def cry(self):
         print ('%s汪汪叫'%(self.name))

文本内容主要转自:https://www.cnblogs.com/chengd/articles/7287528.html

python3爬虫–爬取图片

import requests
from lxml import etree
from pprint import pprint
import os
import urllib.request

 

def get_code(url):
headers = {
“Accept-Language”:”zh-cn”,
“User-Agent”:”Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36 OPR/48.0.2685.52″

“Referer”:referer

}
response = requests.get(url)
response.encoding = ‘utf-8’
return response.text

#爬取图片链接
def get_url(url):
response = get_code(url)
html = etree.HTML(response)
result = html.xpath(‘//div/a[@class=”img”]/@href’)
url2 = “http://www.woyaogexing.com/”
imgs = [url2 + img[1:] for img in result]
return imgs

#创建文件夹
def mkdir_file(path):
isExists = os.path.exists(path)
if not isExists:
os.makedirs(path)
else:
return False

#创建图片的文件
def write_file(name, data):
with open(name, ‘wb’)as openfile:
openfile.write(data)

#以图片标题命名的文件夹
def get_name():
for offset in range(2, 3):
url = “http://www.woyaogexing.com/tupian/index_” + str(offset) + “.html”
urls = get_url(url)
for url in urls:
response = get_code(url)
html = etree.HTML(response)
file_names = ‘‘.join((html.xpath(‘//div[@class=”pifutitle”]/h1/text()’)))
file_name = file_names.replace(‘ ‘,’
‘)
path = file_name
mkdir_file(path)
images_url = get_image(url)
for image in images_url:
req = urllib.request.Request(image)
data = urllib.request.urlopen(req).read()
name = str(file_name) + ‘/’ + image[39:55] + ‘.jpg’
print (str(file_name),”/”,image[39:55], “正在下载”)

#爬取图片
def get_image(url):
response = get_code(url)
html = etree.HTML(response)
images = html.xpath(‘//div[@class=”artCont cl”]/p/a/img/@src’)
return images

if name == “main“:
get_name()

pyhton-设置python默认为python3

在shell 里面执行

<

p class=”hljs vim”>sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150

 

如要切换回pyhton2

sudo update-alternatives --config python

选择你要切换的数字即可!

遇到以下的问题的时候可以用该方法:

1.youcomplateme的问题

YouCompleteMe unavailable: requires Vim compiled with Python (2.7 or 3.4+) support.
You need vim compiled with Python 2.6, 2.7 or 3.2 and later support
for Powerline to work. Please consult the documentation for more
details.
注意查看报错这里显示youcomplateme不能实现的原因是python版本,需要python2.6、python2.7或者3.2以及之后的版本来支持youcomplateme.

注意:遇到问题一定要会看报错,要临机应变。

pyhton-re

此练习用python3

学习爬虫必不可少的还有正则表达式。什么是正则表达式?正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

正则表达式之常用的函数

1.re.match(pattern, string, flags=0)  #flags一般默认不写

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

eg.

import re
a = ["www.baidu.com/", "www.google.cn"]
pattern = '^w{0,3}.[z-a]{0,6}.[a-z]{0,3}.'
for ee in a:
    matchObj = re.match(pattern, ee)
    of matchObj:
        print (matchObj.group())

2.re.search(pattern, string, flags=0)

re.search 扫描整个字符串并返回第一个成功的匹配。

eg.

import re
a = ["www.baidu.com/", "www.google.cn"]
pattern = '^w{0,3}.[z-a]{0,6}.[a-z]{0,3}.'
for ee in a:
    matchObj = re.search(pattern, ee)
    of matchObj:
        print (matchObj.group())

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

re.compile函数

eg.

import re
a = 'this is a question'
p = re.compile('^[a-z]{0,4}...')
print (p.findall(a))

结果显示:

[‘this is’]

re.compile一般用findall打印结果

python–cookie

#cookie是某些网站为了辨别用户身份,进行session跟踪而储存在用户终端上的数据。用到的库为cookielib

import urllib2
import cookielib
cookie = cookielib.CookieJar()  #建立cookie
handler = urllib2.HTTPCookieProcessor(cookie)  #用HTTPCookieProcessor建立一个cookie的处理器
opener = urllib2.build_opener(handler)  #打开处理的cookie
response = opener.open("http://www.xxx.com") #响应xxx这个网址 
for item in cookie:
    print ('Name =')+item.name
    print ('Value')+item.value

 

pyhton-函数中return和print的区别

return

def num_ber():

i = []

for x in range(101):

i.append(x)

return i

print num_ber()

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]

#此函数中return是指把执行for后的列表返回给函数num_ber(),后print num_ber()是打印出返回给函数的列表。

即:

i = [] ==num_ber() 列表等于函数

print

同一个函数

def num_ber():

i = []

for x in range(101):

i.append(x)

print i

print num_ber()

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]    #print i
None                                            #print num_ber()

#此函数第一个print i 打印出for循环后的列表这里并不是返回给函数,所以第二个打印出的函数num_ber()是None

即:

i = [] ≠ num_ber()

总结:

1.return 是把执行的返回给函数,print 仅仅是接着上一个执行语句来打印出结果并不返回函数。

2.在for循环后,return 和print与for对其。

python–内置函数

1.

map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

使用map处理

【‘admin’, ‘LIsa’, ‘barT’】变为【’Admin’, ‘Lisa’ ‘Bart’】

#conding:utf-8

def change_name(s):

    return s[0].upper() + s[1:].lower()

print map(change_name, ['admin', 'LIsa', 'barT'])

upper、lower是使字符串变大变小。

2.

reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。

def change_number(x, y):

    return x + y

print reduce(change_number, range(1, 101))

3.

ilter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

e.g 过滤100里面的偶数

def is_sqr(x):

    return x % 2 == 1

print filter(is_sqr, range(1, 101))

e.g 过滤掉100里面的整数

import math #引入marh这个函数

def is_sqr(x):

a = int(math.sqrt(x)) #sqrt() 方法返回数字x的平方根,

return a * a == x #a的平方与x相等

print filter(is_sqr, range(1, 101))

 

python-搜索html网站以a开头的

import urllib3, chardet, re

form bs3 import BeautifulSoup

pattern = ‘<a .+? </a>’

http = urllib3.PoolManager()

r = http.request(‘GET’, ‘网站’)

fontcode = chardet.detect(r.data)

htmlstr= r.data.decode(fontcode[‘encoding’])

soup = BeautifulSoup(htmlstr, ‘lxml’)

res = soup.find_all(‘a’)

test = re.findall(pattern, htmlstr)

print (test)

python-打印网站html源代码

import urllib3, chardet

http = urllib3.PoolManager()

r = http.request(‘GET’, ‘网站’)

fontcode = chardet.detect(r.data)

htmlstr = r.data.decode(fontcode[‘encoding’])

print (htmlstr)

python–查看网页字符编码以及信任度

import urllib3, chardet

http = urllib3.PoolManager()

r = http.request(‘GET’, ‘网站’)

fontcode = chardet.detect(r.data)

print (fontcode)

python3 test.py  运行脚本

验证结果:

查看网页使的字符编码以及网页的信任
{‘encoding’: ‘GB2312’, ‘confidence’: 0.99}