`
uule
  • 浏览: 6312185 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

Python基础知识

 
阅读更多

python字符串的常用操作方法小结

 

一、基础

import urllib.request  
response = urllib.request.urlopen('http://www.baidu.com/')  
html = response.read()  
print(html)

 

urlopen参数可以传入一个request请求,它其实就是一个Request类的实例

import urllib.request   
request = urllib.request.Request("http://www.baidu.com")
response = urllib.request.urlopen(request)
html = response.read()  
print(html)

 

注意Python3中:

urllib2已拆分更名为urllib.request和urllib.error 

except urllib2.URLError, e变为  except urllib.error.URLError as e 

Python3中,cookielib改成 http.cookiejar,方法里也需改成 http.cookiejar

python3.x系列不再有 raw_input 函数。3.x中 input 和从前的 raw_input 等效 

 

 

二、GET、POST

POST
方式1:

 

import urllib
import urllib2
 
values = {"username":"1016903103@qq.com","password":"XXXX"}
data = urllib.urlencode(values) 
url = "https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"
request = urllib2.Request(url,data)
response = urllib2.urlopen(request)
print response.read()

 方式2:

 

import urllib
import urllib2
 
values = {}
values['username'] = "1016903103@qq.com"
values['password'] = "XXXX"
data = urllib.urlencode(values) 
url = "http://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"
request = urllib2.Request(url,data)
response = urllib2.urlopen(request)
print response.read()

 

GET

 

import urllib
import urllib2
 
values={}
values['username'] = "1016903103@qq.com"
values['password']="XXXX"
data = urllib.urlencode(values) 
url = "http://passport.csdn.net/account/login"
geturl = url + "?"+data
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
print response.read()

 

三、异常捕获

 在代码中,我们需要用try-except语句来包围并捕获相应的异常 URLError

import urllib.request
 
requset = urllib.request.Request('http://www.xxxxx.com')
try:
    urllib.request.urlopen(requset)
except urllib.error.URLError as e:
    print(e.reason)

 

 HTTPError是URLError的子类,在你利用urlopen方法发出一个请求时,服务器上都会对应一个应答对象response,其中它包含一个数字”状态码”。

HTTPError实例产生后会有一个code属性,这就是是服务器发送的相关错误号。

因为urllib2可以为你处理重定向,也就是3开头的代号可以被处理,并且100-299范围的号码指示成功,所以你只能看到400-599的错误号码。

 

import urllib.request
 
req = urllib.request.Request('http://blog.csdn.net/cqcre')
try:
    urllib.request.urlopen(req)
except urllib.request.HTTPError as e:
    print(e.code)
    print(e.reason)

 结果:

403

Forbidden

 

 HTTPError的父类是URLError,根据编程经验,父类的异常应当写到子类异常的后面,如果子类捕获不到,那么可以捕获父类的异常,所以上述的代码可以这么改写

import urllib.request

req = urllib.request.Request('http://blog.csdn.net/cqcre')
try:
    urllib.request.urlopen(req)
except urllib.request.HTTPError as e:
    print(e.code)
except urllib.request.URLError as e:
    print(e.reason)
else:
    print("OK")

 如果捕获到了HTTPError,则输出code,不会再处理URLError异常。如果发生的不是HTTPError,则会去捕获URLError异常,输出错误原因。

另外还可以加入 hasattr属性提前对属性进行判断,代码改写如下

 

import urllib.request
 
req = urllib.request.Request('http://blog.csdn.net/cqcre')
try:
    urllib.request.urlopen(req)
except urllib.request.URLError as e:
    if hasattr(e,"code"):
        print(e.code)
    if hasattr(e,"reason"):
        print(e.reason)
else:
    print("OK")

 

四、response中的info()和geturl()

 urlopen返回的应答对象response(或者HTTPError实例)有两个很有用的方法info()和geturl()

 1.geturl():

这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许会有重定向。获取的URL或许跟请求URL不同。

import urllib.request

old_url = 'https://aaa.com'
try:
	req = urllib.request.Request(old_url)
	response = urllib.request.urlopen(req)
	print('Old url:' + old_url)
	print('Real url:' + response.geturl())
except urllib.request.URLError as e:
	print(e.code)
	print(e.reason)
		
#结果:
#Old url:https://xxx.com/
#Real url:https://www.xxx.com/index.jsp	

 或者为:

from urllib.request import Request, urlopen, URLError, HTTPError
old_url = 'http://xxx.com/'
try:
	req = Request(old_url)
	response = urlopen(req)
	print('Old url:' + old_url)
	print('Real url:' + response.geturl())
except urllib.request.URLError as e:
	print(e.code)
	print(e.reason)

 

 2.info():

这个返回对象的字典对象,该字典描述了获取的页面情况。通常是服务器发送的特定头headers。

 

from urllib.request import Request, urlopen, URLError, HTTPError  
  
old_url = 'http://www.baidu.com'  
req = Request(old_url)  
response = urlopen(req)    
print('Info():')  
print(response.info())  

 

 五、Cookie

Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)

比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的。那么我们可以利用Urllib2库保存我们登录的Cookie,然后再抓取其他页面就达到目的了。

 

1.Opener

当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例)。在前面,我们都是使用的默认的opener,也就是urlopen。它是一个特殊的opener,传入的参数仅仅是url,data,timeout。

如果我们需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建更一般的opener来实现对Cookie的设置。

 

2.Cookielib

cookielib模块的主要作用是提供可存储cookie的对象,我们可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送,比如可以实现模拟登录 功能。该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

 

它们的关系:CookieJar —-派生—->FileCookieJar —-派生—–>MozillaCookieJar和LWPCookieJar

Python3中,cookielib改成 http.cookiejar,方法里也需改成 http.cookiejar

 

1)获取Cookie保存到变量

import urllib.request
import http.cookiejar
#声明一个CookieJar对象实例来保存cookie
cookie = http.cookiejar.CookieJar()
#利用urllib.request库的HTTPCookieProcessor对象来创建cookie处理器
handler=urllib.request.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener = urllib.request.build_opener(handler)
#此处的open方法同urllib.request的urlopen方法,也可以传入request
response = opener.open('http://www.baidu.com')
for item in cookie:
    print('Name = '+item.name)
    print('Value = '+item.value)

 结果:

Name = BAIDUID
Value = B07B663B645729F11F659C02AAE65B4C:FG=1
Name = BAIDUPSID
Value = B07B663B645729F11F659C02AAE65B4C
Name = H_PS_PSSID
Value = 12527_11076_1438_10633
Name = BDSVRTM
Value = 0
Name = BD_HOME
Value = 0

 

2)保存Cookie到文件

 

在上面的方法中,我们将cookie保存到了cookie这个变量中,如果我们想将cookie保存到文件中该怎么做呢?这时,我们就要用到FileCookieJar这个对象了,在这里我们使用它的子类MozillaCookieJar来实现Cookie的保存

import http.cookiejar
import urllib.request
 
#设置保存cookie的文件,同级目录下的cookie.txt
filename = 'cookie.txt'
#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = http.cookiejar.MozillaCookieJar(filename)
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler = urllib.request.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener = urllib.request.build_opener(handler)
#创建一个请求,原理同urllib2的urlopen
response = opener.open("http://www.baidu.com")
#保存cookie到文件
cookie.save(ignore_discard=True, ignore_expires=True)

 

 3)从文件中获取Cookie并访问

那么我们已经做到把Cookie保存到文件中了,如果以后想使用,可以利用下面的方法来读取cookie并访问网站

import http.cookiejar
import urllib.request
 
#创建MozillaCookieJar实例对象
cookie = http.cookiejar.MozillaCookieJar()
#从文件中读取cookie内容到变量
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
#创建请求的request
req = urllib.request.Request("http://www.baidu.com")
#利用urllib2的build_opener方法创建一个opener
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie))
response = opener.open(req)
print(response.read())

 

如果我们的 cookie.txt 文件中保存的是某个人登录百度的cookie,那么我们提取出这个cookie文件内容,就可以用以上方法模拟这个人的账号登录百度

 

例子:

创建一个带有cookie的opener,在访问登录的URL时,将登录后的cookie保存下来,然后利用这个cookie来访问其他网址。

如登录之后才能查看的成绩查询呀,本学期课表呀等等网址,模拟登录就这么实现啦

import urllib
import urllib2
import cookielib
 
filename = 'cookie.txt'
#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = cookielib.MozillaCookieJar(filename)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
postdata = urllib.urlencode({
			'stuid':'201200131012',
			'pwd':'23342321'
		})
#登录教务系统的URL
loginUrl = 'http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bks_login2.login'
#模拟登录,并把cookie保存到变量
result = opener.open(loginUrl,postdata)
#保存cookie到cookie.txt中
cookie.save(ignore_discard=True, ignore_expires=True)
#利用cookie请求访问另一个网址,此网址是成绩查询网址
gradeUrl = 'http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bkscjcx.curscopre'
#请求访问成绩查询网址
result = opener.open(gradeUrl)
print result.read()

 

 

 六、str和bytes类型之间的常用转码方式:

1、str to bytes:(3种方式)


 

2、bytes to str (3种方式) 


 
 

 

 七、正则表达式

 

content = response.read().decode('utf-8')
pattern = re.compile('<div.*?class="author.*?>.*?<a.*?</a>.*?<a.*?>(.*?)</a>.*?<div.*?class'+
                     '="content".*?title="(.*?)">(.*?)</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
items = re.findall(pattern,content)
for item in items:
    print item[0],item[1],item[2],item[3],item[4]

 现在正则表达式在这里稍作说明

 

1).*? 是一个固定的搭配,.和*代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配,以后我们还会大量用到 .*? 的搭配。

 

2)(.*?)代表一个分组,在这个正则表达式中我们匹配了五个分组,在后面的遍历item中,item[0]就代表第一个(.*?)所指代的内容,item[1]就代表第二个(.*?)所指代的内容,以此类推。

 

3)re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符。

#获取帖子一共有多少页
def getPageNum(self):
    page = self.getPage(1)
    pattern = re.compile('<li class="l_reply_num.*?</span>.*?<span.*?>(.*?)</span>',re.S)
    result = re.search(pattern,page)
    if result:
        #print result.group(1)  #测试输出
        return result.group(1).strip() #strip()将前后多余内容删除
    else:
        return None

 

八、Python创建目录文件夹

Python对文件的操作还算是方便的,只需要包含os模块进来,使用相关函数即可实现目录的创建。

主要涉及到三个函数

1、os.path.exists(path) 判断一个目录是否存在

2、os.makedirs(path) 多层创建目录

3、os.mkdir(path) 创建目录

def mkdir(path):
    # 引入模块
    import os
 
    # 去除首位空格
    path=path.strip()
    # 去除尾部 \ 符号
    path=path.rstrip("\\")
 
    # 判断路径是否存在
    # 存在     True
    # 不存在   False
    isExists=os.path.exists(path)
 
    # 判断结果
    if not isExists:
        # 如果不存在则创建目录
        print path+' 创建成功'
        # 创建目录操作函数
        os.makedirs(path)
        return True
    else:
        # 如果目录存在则不创建,并提示目录已存在
        print path+' 目录已存在'
        return False
 
# 定义要创建的目录
mkpath="d:\\qttc\\web\\"
# 调用函数
mkdir(mkpath)

 上面没有使用os.mkdir(path)函数,而是使用了多层创建目录函数os.makedirs(path)。

这两个函数之间最大的区别是当父目录不存在的时候os.mkdir(path)不会创建,os.makedirs(path)则会创建父目录。

 

Python3写入文件常用方法

all_the_text = 'hello python'

# 最简单的方法
open('d:/text.txt', 'w').write(all_the_text)
all_the_data = b'abcd1234'
open('d:/data.txt', 'wb').write(all_the_data)

# 更好的办法
file_object = open('d:/text2.txt', 'w') 
file_object.write(all_the_text)
file_object.close()

# 分段写入
list_of_text_strings = ['hello', 'python', 'hello', 'world']
file_object = open('d:/text3.txt', 'w')
for string in list_of_text_strings:
    file_object.writelines(string)
  
list_of_text_strings = ['hello', 'python', 'hello', 'world']
file_object = open('d:/text4.txt', 'w')
file_object.writelines(list_of_text_strings)

 

九、文件写入简介

在这里,我们有写入图片和写入文本两种方式

 

1)写入图片

#传入图片地址,文件名,保存单张图片
def saveImg(self,imageURL,fileName):
	 u = urllib.urlopen(imageURL)
	 data = u.read()
	 f = open(fileName, 'wb')
	 f.write(data)
	 print(u"正在悄悄保存她的一张图片为",fileName)
	 f.close()

 

2)写入文本

def saveBrief(self,content,name):
	fileName = name + "/" + name + ".txt"
	f = open(fileName,"w+")
	print(u"正在偷偷保存她的个人信息为",fileName)
	f.write(content.encode('utf-8'))

 

3)创建新目录

def mkdir(self,path):
	path = path.strip()
	# 判断路径是否存在
	# 存在     True
	# 不存在   False
	isExists=os.path.exists(path)
	# 判断结果
	if not isExists:
		# 如果不存在则创建目录
		print(u"偷偷新建了名字叫做",path,u'的文件夹')
		# 创建目录操作函数
		os.makedirs(path)
		return True
	else:
		# 如果目录存在则不创建,并提示目录已存在
		print(u"名为",path,'的文件夹已经创建成功')
		return False

 

发送请求时带Header:

import urllib,urllib2

url = 'http://www.super-ping.com/ping.php?node='+node+'&ping=www.google.com'
headers = { 'Host':'www.super-ping.com',
			'Connection':'keep-alive',
			'Cache-Control':'max-age=0',
			'Accept': 'text/html, */*; q=0.01',
			'X-Requested-With': 'XMLHttpRequest',
			'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36',
			'DNT':'1',
			'Referer': 'http://www.super-ping.com/?ping=www.google.com&locale=sc',
			'Accept-Encoding': 'gzip, deflate, sdch',
			'Accept-Language': 'zh-CN,zh;q=0.8,ja;q=0.6'
			}
data = None
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
compressedData = response.read()

 

反盗链

某些站点有所谓的反盗链设置,其实说穿了很简单,

就是检查你发送请求的header里面,referer站点是不是他自己,

所以我们只需要像把headers的referer改成该网站即可,以cnbeta为例:

headers = {
    'Referer':'http://www.cnbeta.com/articles'
}

 headers是一个dict数据结构,你可以放入任何想要的header,来做一些伪装。

例如,有些网站喜欢读取header中的X-Forwarded-For来看看人家的真实IP,可以直接把X-Forwarde-For改了。

 

编码:

使用encode()函数对字符串进行编码,转换成二进制字节数据

可用decode()函数将字节解码成字符串

 

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘utf-8’),表示将unicode编码的字符串转换成utf-8编码。

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘utf-8’),表示将utf-8编码的字符串转换成unicode编码。

 

http://www.cnblogs.com/284628487a/p/5584714.html

Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

现在,捋一捋ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节。

==================================================================

 

1、多行语句

Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠(\)来实现多行语句,例如:

total = item_one + \
        item_two + \
        item_three

 

在 [], {}, 或 () 中的多行语句,不需要使用反斜杠(\),例如:

total = ['item_one', 'item_two', 'item_three',
        'item_four', 'item_five']

 

2、字符串

python中单引号和双引号使用完全相同

使用三引号('''或""")可以指定一个多行字符串

转义符 '\'

自然字符串, 通过在字符串前加r或R。 如 r"this is a line with \n" 则\n会显示,并不是换行

python允许处理unicode字符串,加前缀u或U, 如 u"this is an unicode string"。

字符串是不可变的。

 

先说1双引号与3个双引号的区别,双引号所表示的字符串通常要写成一行 

如: 

s1 = "hello,world" 

如果要写成多行,那么就要使用/ (“连行符”),如 

s2 = "hello,/ 

world" 

s2与s1是一样的。如果你用3个双引号的话,就可以直接写了,如下: 

s3 = """hello, 
world, 
hahaha."""

 那么s3实际上就是"hello,/nworld,/nhahaha.", 注意“/n”,所以,如果你的字符串里/n很多,你又不想在字符串中用/n的话,那么就可以使用3个双引号。而且使用3个双引号还可以在字符串中增加注释,如下: 

s3 = """hello,  #hoho, this is hello, 在3个双引号的字符串内可以有注释哦 

world,          #hoho, this is world 

hahaha."""

 

不过在print s3的时候连注释内容会一起给打印出来。这就是3个双引号和1个双引号表示字符串的区别了

 

实际上python支持单引号是有原因的,下面我来比较1个单引号和1个双引号的区别:

 

当我用单引号来表示一个字符串时,如果要表示 Let's go 这个字符串,必须这样:

s4 = 'Let/'s go'

注意没有,字符串中有一个',而字符串又是用'来表示,所以这个时候就要使用转义符 / , 如果你的字符串中有一大堆的转义符,看起来肯定不舒服,python也很好的解决了这个问题,

如下:s5 = "Let's go" 

这时,我们看,python知道你是用 " 来表示字符串,所以python就把字符串中的那个单引号 ' , 当成普通的字符处理了,是不是很简单。 

对于双引号,也是一样的,下面举个例子 

s6 = 'I realy like "python"!' 

这就是单引号和双引号都可以表示字符串的原因了

 

同一行显示多条语句

Python可以在同一行中使用多条语句,语句之间使用分号(;)分割

 

import sys; x = 'runoob'; sys.stdout.write(x + '\n')

 

字符串格式化

字符串格式化符号与C语言一样,查下即可

 

print ("我叫 %s 今年 %d 岁!" % ('小明', 10) )

结果: 

我叫 小明 今年 10 岁!

 

python字符串连接的N种方式

 

最原始的字符串连接方式:str1 + str2

python 新字符串连接语法:str1, str2

奇怪的字符串方式:str1 str2

% 连接字符串:‘name:%s; sex: ’ % ('tom', 'male')

字符串列表连接:str.join(some_list)

 

第一种,有编程经验的人都知道,直接用 “+” 来连接两个字符串

'Jim' + 'Green' = 'JimGreen'

 

第二种比较特殊,如果两个字符串用“逗号”隔开,那么这两个字符串将被连接,但是,字符串之间会多出一个空格

'Jim', 'Green' = 'Jim Green'

 

第三种也是 python 独有的,只要把两个字符串放在一起,中间有空白或者没有空白:两个字符串自动连接为一个字符串

'Jim''Green' = 'JimGreen'

'Jim'  'Green' = 'JimGreen'

 

第四种功能比较强大,借鉴了C语言中 printf 函数的功能,如果你有C语言基础,看下文档就知道了。这种方式用符号“%”连接一个字符串和一组变量,字符串中的特殊标记会被自动用右边变量组中的变量替换:

'%s, %s' % ('Jim', 'Green') = 'Jim, Green'

 

第五种就属于技巧了,利用字符串的函数 join 。这个函数接受一个列表,然后用字符串依次连接列表中每一个元素

var_list = ['tom', 'david', 'john']

a = '###'

a.join(var_list) =  'tom###david###john'

 

其实,python 中还有一种字符串连接方式,不过用的不多,就是字符串乘法,如:

a = 'abc'

a * 3 = 'abcabcabc'

 

=================================

 

3、多个语句构成代码组

像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组。

if expression : 

   suite

elif expression : 

   suite 

else : 

   suite

   

   

print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=""

x="a"
y="b"
# 换行输出
print( x )
print( y )

print('---------')
# 不换行输出
print( x, end=" " )
print( y, end=" " )
print()
print("==========")  

  结果:注意空白行没显示,print()也没显示



 

 

4、Python3 基本数据类型

Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。

 

多个变量赋值

Python允许你同时为多个变量赋值。例如:

a = b = c = 1

以上实例,创建一个整型对象,值为1,三个变量被分配到相同的内存空间上。

 

也可以为多个对象指定多个变量。例如:

a, b, c = 1, 2, "runoob"

以上实例,两个整型对象 1 和 2 的分配给变量 a 和 b,字符串对象 "runoob" 分配给变量 c

 

Python3 中有六个标准的数据类型:

Number(数字)

String(字符串)

List(列表)

Tuple(元组)

Sets(集合)

Dictionary(字典)

 

 

Number(数字)

Python3 支持 int、float、bool、complex(复数)。

在Python 3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。

 

内置的 type() 函数可以用来查询变量所指的对象类型。

>>> a, b, c, d = 20, 5.5, True, 4+3j
>>> print(type(a), type(b), type(c), type(d))
<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>

 

还可以用 isinstance 来判断:

>>> a = 111
>>> isinstance(a, int)
True


class A:
    pass

isinstance(A(), A)  # returns True
type(A()) == A      # returns True

 

注意:

1、Python可以同时为多个变量赋值,如a, b = 1, 2

2、一个变量可以通过赋值指向不同类型的对象

3、数值的除法(/)总是返回一个浮点数,要获取整数使用//操作符。

4、在混合计算时,Python会把整型转换成为浮点数。

 

complex:

3.14j

45.j

3e+26J

Python还支持复数,复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型

 

String(字符串)

Python中的字符串用单引号(')或双引号(")括起来,同时使用反斜杠(\)转义特殊字符

字符串的截取的语法格式如下:

变量[头下标:尾下标]

索引值以 0 为开始值,-1 为从末尾的开始位置。

加号 (+) 是字符串的连接符, 星号 (*) 表示复制当前字符串,紧跟的数字为复制的次数

str = 'Runoob'

print (str)          # 输出字符串 Runoob
print (str[0:-1])    # 输出第一个个到倒数第二个的所有字符 Runoo
print (str[0])       # 输出字符串第一个字符  R
print (str[2:5])     # 输出从第三个开始到第五个的字符  noo
print (str[2:])      # 输出从第三个开始的后的所有字符  noob
print (str * 2)      # 输出字符串两次  RunoobRunoob
print (str + "TEST") # 连接字符串  RunoobTEST

 

 

Python 使用反斜杠(\)转义特殊字符,如果你不想让反斜杠发生转义,可以在字符串前面添加一个 r,表示原始字符串

>>> print('Ru\noob')
Ru
oob
>>> print(r'Ru\noob')
Ru\noob

 

注意:

1、反斜杠可以用来转义,使用r可以让反斜杠不发生转义。

2、字符串可以用+运算符连接在一起,用*运算符重复。

3、Python中的字符串有两种索引方式,从左往右以0开始,从右往左以-1开始。

4、Python中的字符串不能改变。

与 C 字符串不同的是,Python 字符串不能被改变。向一个索引位置赋值,比如word[0] = 'm'会导致错误。

 

List(列表)

列表是写在方括号[ ]之间、用逗号分隔开的元素列表。

list = [ 'abcd', 786 , 2.23, 'runoob', 70.2 ]
tinylist = [123, 'runoob']
print (list + tinylist)	 # 连接列表
['abcd', 786, 2.23, 'runoob', 70.2, 123, 'runoob']

 

截取方式和字符串一样。

 

与字符串不一样的是,列表中的元素是可以改变的

>>> a = [1, 2, 3, 4, 5, 6]

>>> a[0] = 9


 

#删除列表元素
用 del 语句来删除列表的的元素:

list = ['Google', 'Runoob', 1997, 2000]

print (list)
del list[2]
print ("删除第三个元素 : ", list)

结果:
删除第三个元素 :  ['Google', 'Runoob', 2000]
注意:我们会在接下来的章节讨论remove()方法的使用


#列表截取与拼接
Python的列表截取与字符串操作类型,如下所示:
L=['Google', 'Runoob', 'Taobao']

L[2]	'Taobao'				读取第三个元素
L[-2]	'Runoob'				从右侧开始读取倒数第二个元素: count from the right
L[1:]	['Runoob', 'Taobao']	输出从第二个元素开始后的所有元素

拼接
>>> squares = [1, 4, 9, 16, 25]
>>> squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]


#嵌套列表
使用嵌套列表即在列表里创建其它列表,例如:
>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]

>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'

 

 

>>> a = [66.25, 333, 333, 1, 1234.5]
>>> print(a.count(333), a.count(66.25), a.count('x'))
2 1 0
>>> a.insert(2, -1)
>>> a.append(333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.25]
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]

 将列表当做堆栈使用

列表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。用 append() 方法可以把一个元素添加到堆栈顶。用不指定索引的 pop() 方法可以把一个元素从堆栈顶释放出来。例如:

>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]

 将列表当作队列使用

也可以把列表当做队列用,只是在队列里第一加入的元素,第一个取出来;但是拿列表用作这样的目的效率不高。在列表的最后添加或者弹出元素速度快,然而在列表里插入或者从头部弹出速度却不快(因为所有其他的元素都得一个一个地移动)。

>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry")           # Terry arrives
>>> queue.append("Graham")          # Graham arrives
>>> queue.popleft()                 # The first to arrive now leaves
'Eric'
>>> queue.popleft()                 # The second to arrive now leaves
'John'
>>> queue                           # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])

 列表推导式

列表推导式提供了从序列创建列表的简单途径。将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。

每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。

这里我们将列表中每个数值乘三,获得一个新的列表:

>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]
现在我们玩一点小花样:
>>> [[x, x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]
这里我们对序列里每一个元素逐个调用某方法:
>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
我们可以用 if 子句作为过滤器:
>>> [3*x for x in vec if x > 3]
[12, 18]
>>> [3*x for x in vec if x < 2]
[]

 del 语句

使用 del 语句可以从一个列表中依索引而不是值来删除一个元素。这与使用 pop() 返回一个值不同。可以用 del 语句从列表中删除一个切割,或清空整个列表(我们以前介绍的方法是给该切割赋一个空列表)。例如:

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]

 在序列中遍历时,索引位置和对应值可以使用 enumerate() 函数同时得到:

>>> for i, v in enumerate(['tic', 'tac', 'toe']):
...     print(i, v)
...
0 tic
1 tac
2 toe

 同时遍历两个或更多的序列,可以使用 zip() 组合

>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
...     print('What is your {0}?  It is {1}.'.format(q, a))
...
What is your name?  It is lancelot.
What is your quest?  It is the holy grail.
What is your favorite color?  It is blue.

 

反向遍历一个序列,首先指定这个序列,然后调用 reversed() 函数

>>> for i in reversed(range(1, 10, 2)):
...     print(i)
...
9
7
5
3
1

 

按顺序遍历一个序列,使用 sorted() 函数返回一个已排序的序列,并不修改原值:

>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
...     print(f)
...
apple
banana
orange
pear

  

Tuple(元组)

元组(tuple)与列表类似,不同之处在于元组的元素不能修改

元组写在小括号()里,元素之间用逗号隔开

tuple = ( 'abcd', 786 , 2.23, 'runoob', 70.2  )
tinytuple = (123, 'runoob')
print (tuple + tinytuple) # 连接元组
('abcd', 786, 2.23, 'runoob', 70.2, 123, 'runoob')

 

虽然tuple的元素不可改变,但它可以包含可变的对象,比如list列表。

构造包含 0 个或 1 个元素的元组比较特殊,所以有一些额外的语法规则:

tup1 = ()    # 空元组

tup2 = (20,) # 一个元素,需要在元素后添加逗号

 

注意:

1、与字符串一样,元组的元素不能修改。

2、元组也可以被索引和切片,方法一样。

3、注意构造包含0或1个元素的元组的特殊语法规则。

4、元组也可以使用+操作符进行拼接。



 

#修改元组
元组中的元素值是不允许修改的,但我们可以对元组进行连接组合

tup1 = (12, 34.56);
tup2 = ('abc', 'xyz')

tup3 = tup1 + tup2;
print (tup3)
结果:
(12, 34.56, 'abc', 'xyz')


#删除元组
元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,如下实例:

tup = ('Google', 'Runoob', 1997, 2000)
del tup;


#tuple(seq)
将列表转换为元组。	
>>> list1= ['Google', 'Taobao', 'Runoob', 'Baidu']
>>> tuple1=tuple(list1)
>>> tuple1
('Google', 'Taobao', 'Runoob', 'Baidu')

 

 

Set(集合)

集合(set)是一个无序不重复元素的序列。

基本功能是进行成员关系测试和删除重复元素。

可以使用大括号({})或者 set()函数创建集合

注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典

student = ({'Tom', 'Jim', 'Mary', 'Tom', 'Jack', 'Rose'})
print(student)   # 输出集合,重复的元素被自动去掉


# 成员测试
if('Rose' in student) :
    print('Rose 在集合中')
else :
    print('Rose 不在集合中')
	
	
# set可以进行集合运算
a = set('abracadabra')
b = set('alacazam')
print(a - b)     # a和b的差集
print(a | b)     # a和b的并集
print(a & b)     # a和b的交集
print(a ^ b)     # a和b中不同时存在的元素

 

Dictionary(字典)

列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

字典是一种映射类型,字典用"{ }"标识,它是一个无序的键(key) : 值(value)对集合

键(key)必须使用不可变类型。

在同一个字典中,键(key)必须是唯一的。

创建空字典使用 { }

dict = {}
dict['one'] = "1 - 菜鸟教程"
dict[2]     = "2 - 菜鸟工具"

tinydict = {'name': 'runoob','code':1, 'site': 'www.runoob.com'}

print (dict['one'])       # 输出键为 'one' 的值
print (dict[2])           # 输出键为 2 的值
print (tinydict)          # 输出完整的字典
print (tinydict.keys())   # 输出所有键
print (tinydict.values()) # 输出所有值

 在字典中遍历时,关键字和对应的值可以使用 items() 方法同时解读出来:

>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
...     print(k, v)
...
gallahad the pure
robin the brave

  

5、Linux/Unix系统中,你可以在脚本顶部添加以下命令让Python脚本可以像SHELL脚本一样可直接执行:

#! /usr/bin/env python3

 

然后修改脚本权限,使其有执行权限,命令如下:

$ chmod +x hello.py

执行以下命令:

./hello.py

 

 

注释

单行注释用#

多行注释用三个单引号(''')或者三个双引号(""")将注释括起来,例如:

 

#!/usr/bin/python3 

'''

这是多行注释,用三个单引号

这是多行注释,用三个单引号 

这是多行注释,用三个单引号

'''

print("Hello, World!") 

 

6、运算符

算术运算符

假设变量a为10,变量b为21

%取模 - 返回除法的余数b % a 输出结果 1

**幂 - 返回x的y次幂a**b 为10的21次方

//取整除 - 返回商的整数部分

9//2 输出结果 4 , 9.0//2.0 输出结果 4.0

 

赋值运算符

%=取模赋值运算符c %= a 等效于 c = c % a

**=幂赋值运算符c **= a 等效于 c = c ** a

//=取整除赋值运算符c //= a 等效于 c = c // a

a = 21
c = 2

c %= a
print ("5 - c 的值为:", c)
c **= a
print ("6 - c 的值为:", c)
c //= a
print ("7 - c 的值为:", c)

5 - c 的值为: 2
6 - c 的值为: 2097152
7 - c 的值为: 99864

 

逻辑运算符

Python语言支持逻辑运算符,以下假设变量 a 为 10, b为 20:

运算符逻辑表达式描述实例

andx and y布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。(a and b) 返回 20。

orx or y布尔"或" - 如果 x 是 True,它返回 True,否则它返回 y 的计算值。(a or b) 返回 10。

notnot x布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。not(a and b) 返回 False

 

成员运算符

in如果在指定的序列中找到值返回 True,否则返回 False。x 在 y 序列中 , 如果 x 在 y 序列中返回 True。

not in如果在指定的序列中没有找到值返回 True,否则返回 False。x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。

a = 10
list = [1, 2, 3, 4, 5 ];

if ( a in list ):
   print ("1 - 变量 a 在给定的列表中 list 中")
else:
   print ("1 - 变量 a 不在给定的列表中 list 中")

 

身份运算符

身份运算符用于比较两个对象的存储单元

 

isis是判断两个标识符是不是引用自一个对象x is y, 如果 id(x) 等于 id(y) , is 返回结果 1

is notis not是判断两个标识符是不是引用自不同对象x is not y, 如果 id(x) 不等于 id(y). is not 返回结果 1

a = 20
b = 20

if ( a is b ):
   print ("1 - a 和 b 有相同的标识")
else:
   print ("1 - a 和 b 没有相同的标识")

 

7、条件控制

 

while 循环

while 循环使用 else 语句

在 while … else 在条件语句为 false 时执行 else 的语句块:

注意while后没有括号,但条件后有个冒号!

count = 0
while count < 5:
   print (count, " 小于 5")
   count = count + 1
else:
   print (count, " 大于或等于 5")
   
结果如下:
0  小于 5
1  小于 5
2  小于 5
3  小于 5
4  小于 5
5  大于或等于 5

 

for循环

for <variable> in <sequence>:

    <statements>

else:

    <statements>

 

 

break和continue语句及循环中的else子句

break 语句可以跳出 for 和 while 的循环体。

如果你从 for 或 while 循环中终止,任何对应的循环 else 块将不执行

 

pass 语句

Python pass是空语句,是为了保持程序结构的完整性。

pass 不做任何事情,一般用做占位语句,如下实例

for letter in 'Runoob': 
   if letter == 'o':
      pass
      print ('执行 pass 块')
   print ('当前字母 :', letter)

print ("Good bye!")

当前字母 : R
当前字母 : u
当前字母 : n
执行 pass 块
当前字母 : o
执行 pass 块
当前字母 : o
当前字母 : b
Good bye!

  

8、  迭代器与生成器

 

迭代器

迭代是是访问集合元素的一种方式

迭代器有两个基本的方法:iter() 和 next()

字符串,列表或元组对象都可用于创建迭代器:

>>> list=[1,2,3,4]
>>> it = iter(list)    # 创建迭代器对象
>>> print (next(it))   # 输出迭代器的下一个元素
1
>>> print (next(it))
2

 

 

迭代器对象可以使用常规for语句进行遍历:

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")
	
结果如下:
1 2 3 4

也可以使用 next() 函数:
import sys         # 引入 sys 模块

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象

while True:
    try:
        print (next(it))
    except StopIteration:
        sys.exit()
执行以上程序,输出结果如下:
1
2
3
4

 

生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行 next()方法时从当前位置继续运行。

   

9、函数

def 函数名(参数列表):

    函数体

 

注意后面有冒号!   

  

参数

以下是调用函数时可使用的正式参数类型:

必需参数

必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

 

关键字参数

通过为参数命名来为它们赋值——这叫做参数关键字—

我们使用名称(关键字)而不是位置(我们一直使用的)来指定函数的参数。

def func(a, b=5, c=10):
    print('a为', a, '和b为', b, '和c为', c)
func(3, 7)
func(25, c=24)
func(c=50, a=100)

输出:
a为3 和b为7 和c为10
a为25 和b为5 和c为24
a为100 和b为5 和c为50

 

默认参数

调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:

 

def printinfo( name, age = 35 ):
   "打印任何传入的字符串"
   print ("名字: ", name);
   print ("年龄: ", age);
   return;
 
printinfo( age=50, name="runoob" );
print ("------------------------")
printinfo( name="runoob" );

名字:  runoob
年龄:  50
------------------------
名字:  runoob
年龄:  35

 

不定长参数    

你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名

def printinfo( arg1, *vartuple ):
   "打印任何传入的参数"
   print ("输出: ")
   print (arg1)
   for var in vartuple:
      print ("=======",var)
   return;
 
# 调用printinfo 函数
#printinfo( 10 );
printinfo( 70, 60, 50 );

输出: 
70
======= 60
======= 50

注意第一个参数! 

 

匿名函数

python 使用 lambda 来创建匿名函数。即不再使用 def 语句这样标准的形式定义一个函数。

lambda 函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。

sum = lambda arg1, arg2 : arg1 + arg2;
 
# 调用sum函数
print ("相加后的值为 : ", sum( 10, 20 ))
print ("相加后的值为 : ", sum( 20, 20 ))
相加后的值为 :  30
相加后的值为 :  40

 

10、模块

模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。

 

import sys

import sys 引入 python 标准库中的 sys.py 模块;这是引入某一模块的方法。

sys.argv 是一个包含命令行参数的列表。

 

from…import 语句

from语句让你从模块中导入一个指定的部分到当前命名空间中

 

from…import * 语句

把一个模块的所有内容全都导入到当前的命名空间

 

__name__属性

一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行

if __name__ == '__main__':
   print('程序自身在运行')
else:
   print('我来自另一模块')

 

说明: 每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。      

 

dir()函数

内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回

dir(sys) 

如果没有给定参数,那么 dir() 函数会罗列出当前定义的所有名称

 

包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。

比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B 

就好像使用模块的时候,你不用担心不同模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名的情况。

 

在导入一个包的时候,Python 会根据 sys.path 中的目录来寻找这个包中包含的子目录。

目录只有包含一个叫做 __init__.py 的文件才会被认作是一个包,主要是为了避免一些滥俗的名字(比如叫做 string)不小心的影响搜索路径中的有效模块。

最简单的情况,放一个空的 :file:__init__.py就可以了。

用户可以每次只导入一个包里面的特定模块,比如:
import sound.effects.echo
这将会导入子模块:sound.effects.echo。 他必须使用全名去访问:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

还有一种导入子模块的方法是:
from sound.effects import echo
这同样会导入子模块: echo,并且他不需要那些冗长的前缀,所以他可以这样使用:
echo.echofilter(input, output, delay=0.7, atten=4)

还有一种变化就是直接导入一个函数或者变量:
from sound.effects.echo import echofilter
同样的,这种方法会导入子模块: echo,并且可以直接使用他的 echofilter() 函数:
echofilter(input, output, delay=0.7, atten=4)

 

注意当使用from package import item这种形式的时候,对应的item既可以是包里面的子模块(子包),或者包里面定义的其他名称,比如函数,类或者变量。

import语法会首先把item当作一个包定义的名称,如果没找到,再试图按照一个模块去导入。如果还没找到,恭喜,一个:exc:ImportError 异常被抛出了。

 

反之,如果使用形如import item.subitem.subsubitem这种导入形式,除了最后一项,都必须是包,而最后一项则可以是模块或者是包,但是不可以是类,函数或者变量的名字。

   

从一个包中导入*

导入语句遵循如下规则:

如果包定义文件 __init__.py 存在一个叫做 __all__ 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入

作为包的作者,可别忘了在更新包之后保证 __all__也更新了啊。

这里有一个例子,在:file:sounds/effects/__init__.py中包含如下代码:

__all__ = ["echo", "surround", "reverse"]

这表示当你使用from sound.effects import * 这种用法时,你只会导入包里面这三个子模块。

 

 

如果 __all__ 真的没有定义,那么使用from sound.effects import *这种语法的时候,就不会导入包 sound.effects 里的任何子模块。他只是把包sound.effects和它里面定义的所有内容导入进来(可能运行__init__.py里定义的初始化代码)。

 

11、

 

12、

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 4.7 KB
  • 大小: 16 KB
  • 大小: 25.9 KB
  • 大小: 87.3 KB
  • 大小: 23.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics