python3常用函数

学习步骤:数据类型  》 数据类型函数  》控制流程语句  》类和对象   》标准库  》 网络爬虫

定义:
Python 是强类型的动态脚本语言(php是弱类型动态脚本语言,java是强类型静态编译型语言)。
1、强类型是指,一个变量被指定了数据类型,如果不经过强制转换,那么就一直是这个数据类型,不允许不同类型相加。
2、动态是指,不使用显示的数据类型声明,在运行期间才去确定数据的类型(第一次赋值时动态判断),这与静态类型(比如java)相反。
3、脚本是指,运行只需要一个解释器,不需要编译,脚本属于解释性语言一种。

常识:
1、python使用缩进来表示代码块,而不使用 {} ,同一个代码块的语句,保持相同的缩进空格数,否则会运行错误。
2、单行注释 # 号,多行注释用 ''' (三个单引号)和 """(三个双引号)。
3、一行中,使用多条语句,语句之间使用分号分割,只有一条语句,则不需要加分号。
4、将整个模块导入: import module;从模块中只导入某个函数: from module import function;

变量:
1、定义变量时,直接写变量名,系统自动判断类型,不用声明类型,不用加$。
2、Python3 中有六个标准的数据类型:
  1)、不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
  2)、可变数据(3 个):List(列表)、Dictionary(字典或映射)、Set(集合)。
  3)、数字有四种类型:int (整数)、bool (布尔)、float (浮点数)、complex (复数)。

数字:
  1)、Python3 的整型不限制大小,Python3废弃了 python2 中的 Long,新增了bool,bool 是 int 的子类,True=1、False=0;在 Python2 中用数字 0 表示 False,用 1 表示 True;
  2)、数值的除法包含两个运算符:/ 返回一个浮点数,// 返回一个整数;比如:2 / 4 = 0.5 ; 2 // 4 = 0;

数字函数:
  #数学函数, 导入 math 模块:import math   
  round(70.23)   #四舍五入,输出70
  round(70.236, 2)  #四舍五入,输出70.24
  ceil(4.1)   #向上取整,输出 5
  floor(4.7)  #向下取整,输出 4

  #随机数,导入 random 模块:import random
  randint(0,10)   #产生 1 到 10 的一个整数型随机数
  random()   #生成 0-1之间(0<=n<1)的实数 
  uniform( min,  max)  #生成min-max之间(min<=n<max)的实数,比如:round( random.uniform(5, 10) ) 生成5-10之间的整数;
  random.choice( 序列)  #从序列中随机返回一个元素,序列可以是列表、元组、字符串;
  


数字和字符串转换:
int(a); float(a) ;str(a)  #a为数字或字符串,注意这不是强制转化,int、float、str是类,这是用类的构造;

字符串:
1、Python 中单引号 ' 和双引号 " 使用完全相同,反斜杠可以用来转义,比如\n,使用 r 可以让反斜杠不发生转义。
2、使用三引号(''' 或 """)可以指定一个多行字符串。
3、字符串可以用 + 运算符连接在一起,用 * 运算符重复。
4、Python 中的字符串不能改变,比如str[0] = 'a'会导致错误。
5、Python 没有单独的字符类型,一个字符就是长度为 1 的字符串。

字符串的截取:

语法:变量[头下标:尾下标:步长]:
str='123456789' 或者 str = [ 'aa', 11 , 2.12, 'bb'];
print(str) # 输出字符串
print(str[0:-1]) # 输出第一个到倒数第二个的所有字符
print(str[0]) # 输出字符串第一个字符
print(str[2:5]) # 输出从第三个开始到第五个的字符
print(str[2:]) # 输出从第三个开始后的所有字符
print(str[1:5:2]) # 输出从第二个开始到第五个且每隔一个的字符(步长为2)
print(str * 2) # 输出字符串两次
print(str + '你好') # 连接字符串
print("%s age is %d" % ('jack', 20))  #多于一个时候,格式化输出字符串:print(字符串 % 元组)
str = " {} age is {1},height is {2:.2f}, weight is {3:10d}".format('jack', 20, 170.1723, 150 )  #语法:"……{数字:格式化标识符}……":字符串.format(元素1,元素2),{}中的数字对应format的元素位置,也可省略

if( "aa" in str)  #成员运算符in,判断字符串是否包含给定的字符
if( "aa" not in str)  #成员运算符 not in,判断字符串是否不包含给定的字符

列表的截取 与字符串的操作一样!
如果str=[ 'aa', 11 , 2.12, 'bb'],上面的操作同样适用,与字符串不一样的是,列表中的元素能改变!比如:str[0]=9


字符串的方法:
len( str )  #字符串长度
str.upper()  # 将字符串的首字母变大写
str.lower()  # 将字符串的首字母变小写
str.strip()  #删除字符串头尾指定的字符(不带参数,默认为空白符,例如:/n, /r, /t, ' '),str.lstrip( "a" )为左删除,str.rstrip( " " )为右删除;

str.find("hello"); #字符串查找,找到返回位置,否则返回-1,语法:str.find(字符串, 查找开始位置=0, 查找结束位置=末尾)
str.replace( "old", "new",)  #字符串替换,语法:str.replace( 旧字符串, 新字符串 );

str.isalnum()  #是否由字母和数字组成
str.isdigit()  #是否只由数字组成

str.split("-")  #把字符串分隔符为列表;
"-".join( list )  #把序列中的元素 以指定的字符 拼接为一个字符串


列表List:常用,List中元素的类型可以不相同。
定义:
list = ['aaa', 'bbb', 111,  222, 3.33]  #中括号包裹
list =   [ ['aaa', 'bbb'], [111,  222], 3.33]   #列表嵌套

列表的操作:
len( list )  #列表长度
list.append( 'ccc' )  #追加
list.insert(1, 'ccc' )  #插入
list.pop(); list.pop(5);  #按索引移除元素,并返回该元素,如果不传参,则移除最后一个元素,即出栈;
list.remove(obj)  #找到某个元素,并删除,无返回值;
del list[2]  #删除
list.index('aaa')  #查找元素,如果找不到则报错,解决方法是,在查找前先判断是否存在:if 'aaa' in list:list.index('aaa')

list + list  #列表拼接,相加
list1 = list.copy()  #复制一个副本,跟=区别是:使用=赋值,是引用赋值,更改一个,另一个同样会变;
operator.eq( list1 , list2 )  #列表比较是否相等,导入 operator 模块:import operator;
list.clear()  #清空

list.reverse()  #反转列表中元素,相对于:list[-1::-1]
list.sort(); #降序 list.sort(reverse=True) #升序,一般对同类型的字符和数字排序
random.shuffle( list )  #打乱列表顺序

max( list )  #返回列表中的最大值
min( list )  #返回列表中的最小值

#判断元素是否存在于列表中
if 3 in list:
  print(“exists”) 

#遍历
for x in list :
  print(x)  



列表推导式:[ 表达式 for 变量 in 序列  if 条件 ]

names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
new_names = [ name.upper()  for name in names  if len(name)>3 ]  #根据某一个列表,生成新的列表,其中,if条件可以忽略
print( new_names )
#输出:['ALICE', 'JERRY', 'WENDY', 'SMITH']

 



元组Tuple:与列表操作一样,但元组的元素不能修改,字符串是一种特殊的元组,不常用。
定义:
tuple = ( 'abcd', 786 , 2.23, 'runoob', 70.2  )  #小括号包裹
tup1 = ()   # 空元组
tup2 = (20,)   # 只含一个元素,需要在元素后加逗号

集合Set:存放不能重复的数据,常被用于过滤重复,不常用。
定义:
  set = {'aaa', 'bbb', 'ccc', 'ddd', 'eee'}
  set = set()  #创建空集合


映射(字典、Dictionary):常用,键是不可变类型,可以用数字,字符串或元组
定义:
map = {'key1': 1111, 'key2':"aaaa", ‘key3’: 'bbbb'}
map = {}  #创建空字典
map = dict() #创建空字典,创建字典另一种方法,是使用内建函数dict()

方法:
len(map)  #长度
str(map)  #把字典转换为字符串
map["key"]  #返回键的值,如果键不在,则报错;
map.get("key"); map.get("key","null");  #返回键的值,如果键不在,则返回默认值None, 默认值可以设置;
map.pop("key1");  map.pop("key1",None); #返回键的值,并删除,当键不存在时,如果没有默认值,会报错;

del map['key1']  #删除键值
del map  #删除字典
map.clear()  #清空字典

map.update(map)  #字典拼接,相同的键会被替换
map.copy()  #字典的浅拷贝,跟=区别是:使用=赋值,是引用赋值,更改一个,另一个同样会变;

map.keys()    #获取所有键,返回为视图对象,可以 list( map.keys()  ) 转换为列表
map.values()   # 获取所有值
map.items()  #获取所有键值对

#判断
if  "key" in map:  #in 操作符,判断键是否存在,not in 操作符刚好相反;

#遍历
for key,value in map.items():
  print(key,":",value)

映射推导式:[ 键表达式:值表达式 for 变量 in 序列  if 条件 ]

list = ['Google','Runoob', 'Taobao']
map = { item:len(item) for item in list }  #利用列表生成映射,其中,if条件可以忽略
print( map )
#输出{'Google': 6, 'Runoob': 6, 'Taobao': 6}

 

流程控制语句:
1、python中用 or、and、not 表示 或、且、非
2、for、while循环外,可以有else
3、函数的参数传递时,如果是可变类型:列表,字典,函数内部修改其自身,比如list[0]=1,函数外他们也跟着改变;如果是重新赋值,比如list=[1,3],则无影响;

if x > 0:
  print("x>0")
elif x == 0:
  print("x=0")
else:
  print("x<0")

for i in range(5):
  print(i)

while x >0:
  print("x>0")

#自定义函数:
语法:def 函数名:函数体
c = 0;
def sum(a, b=0) : #b=0为默认参数
  "这个位置写函数说明"  #调用sum.__doc__可显示;
  global c;  #global引用全局变量;
  return a+b

#匿名函数:只有一行的表达式,而非代码块,使用 lambda 来创建;
sum = lambda a, b: a+ b


类和对象:

1、类的方法跟普通函数区别是,第一个参数必须为自身实例,一般叫self,名字不固定。
2、用@classmethod标注的为类方法,用@staticmethod标注的为静态方法,都能被类和对象调用,区别是类方法有cls,可调用类成员(cls只能获得类变量初始化的值,不能获得new以后赋的值),而静态方法不能调用类成员;

class People:
  name = ""  # 公有变量,外部可直接访问
  __age = 0  #私有变量,俩个下划线开头

  def __init__(self, name,age):  #__init__是构造函数,
    self.name = name
    self.__age = age

  def show(self):  ## 普通方法,对象调用
    print(self.name)

  def __setAge(self, age):  #私有方法,内部调用,俩个下划线开头
    self.__age = age
  
  @classmethod  #类方法,对象和类均能调用,cls是class的缩写,代表的是类,而不是对象self
  def getAge(cls):
    return cls.__age

  @staticmethod  #静态方法,没有self或cls,对象和类均能调用
  def fun():
    print("fun")

class Student( People ):  #类的继承,可以多继承
  weight = 0
  def __init__( self, name, age, weight ):
    People.__init__(self, name, age)  #调用父类构造
    self.weight = weight

  def show(self):  #重写父类的方法
    print("name={} age={} weight={}".format( self.name, self.getAge(), self.weight) )


p = People("jack", 20)  # 实例化类,不需要用"new"
p.show()
s = Student("tom",22,170)  #实例化
s.show()

 


模块:
定义:一个包含自定义的函数和变量的文件,其后缀名是.py
导入全部:import 文件名1,文件名2
导入部分:from 文件名 import 函数名,变量名

包定义:把模块分类保存在不同的文件夹中,每个文件夹都包含__init__.py(一个空文件,告诉 Python 该目录是一个 Python 包),此时可以通过import path1.path2.path3的形式导入模块。 
导入包全部:from 文件名.文件名.文件名 as model  #使用as简化
导入包部分:from 文件名.文件名.文件名 import 函数名,变量名

m.py文件:
str1 = "aa"
def test():
  print("bb")

test01.py文件:  #导入全部
  import m
  m.test()
  print(m.str)


test02.py文件:  #导入部分
  import str1,test from m
  test()
  print(str)

 

标准库、常用库:
import os  #操作系统相关联的函数
import shutil  #日常的文件和目录管理
import glob  #用于从目录通配符搜索中生成文件列表
import sys  #命令行输入、输出、参数
import re  #正则表达式工具
import math  #数学运算
import random  #随机数
import urllib  #访问网络
import requests  #访问网络,更简洁
import time  #时间
import calendar  #年历和月历
import datetime  #日期
import zlib  #打包、压缩
import json  #json
import threading  #多线程
import smtplib  #发送邮件

第三方库: 更多  参考1   参考2
import pymongo  #MongoDB库
主流web框架:Django、Flask、Tornado

时间模块:import time
time()  #当前时间戳
localtime(); localtime(时间戳)  #返回时间信息的元组,包含年月日时分秒,默认为当前时间;
strftime("%Y-%m-%d %H:%M:%S", localtime() )  #返回格式化日期:2022-09-20 11:45:39
sleep( 秒数 )  #休眠几秒

正则表达式:import re
匹配标识:re.I:忽略大小写;re.M:匹配多行;re.S:使 . 匹配包括换行在内的所有字符;
search( r"\d+", "abc123ABC" , re.M|re.I)  #返回第一个成功的【匹配对象】,否则返回None,通常用于判断(是否存在),语法:search(正则, 字符串, 标识)
match( r"\d+", "abc123ABC" , re.M|re.I)  #同上,不同点是,必须起始位置能够匹配,否则返回None,不常用;
findall( r"\d+", "abc123ABC" , re.M|re.I)  #返回所有匹配到的列表list,通常用于查找;
sub( r"\d+"," ", "abc123ABC" )  #返回替换的字符串,语法:sub(正则,替换的字符串,查找字符串)
compile( r"\d+" )  #编译并生成一个正则表达式对象,该对象可调用 match、search、findall等函数,而无需再传递正则;

【匹配对象】的方法:
span():返回一个元组,包含匹配 (开始,结束) 的位置;
group():返回匹配的字符串;


其他函数:
print ("Hello, Python")   # 输出,有换行;
print ("Hello, Python", end=" ")   #输出,没有换行;
str = input("按下 enter 键后退出")   #等待用户输入;
print(r "Hello, Python \n" ) # 反斜杠可以用来转义,使用r可以让反斜杠不发生转义。
del var1, var2  #使用del语句删除单个或多个对象

type( obj )  #获取数据类型
isinstance( sonObj, fatherObj )  #isinstance判断 sonObj是否继承fatherObj
if obj1 is obj2 :...  #is判断两个对象是否为同一类,不判断值是否相等

id( obj )  #id函数返回对象的唯一标识符

range(10)  #内建函数,创建一个整数列表,返回 0-9,不包括10,相等于:range(0,10),语法:range(start, end[, step]),步长默认1
sys.exit()  #系统退出
raise 异常名称  #主动抛出异常

python3关键字有:None、default
python命令行里写多行代码,在每行后面加上  ;\  就可以了
Python 3 源码文件默认以 UTF-8 编码,自定义编码:# -*- coding: UTF-8 -*-
pip 是一个通用的 Python 包管理工具
__name__是python文件的内置变量,当文件被当做脚本执行时, 其值为 '__main__',当被其他文件导入时,则不为 '__main__';
Python中提供一个底层接口WSGI(Python Web Server Gateway Interface: Web服务器网关接口),这个底层接口很好的模拟了web服务器端的类似于Nginx和Apache的功能;
Python 3.5版本出现了:async/await 异步编程;

Scrapy爬虫框架:
基本模块
详解参考
(1) 调度器(Scheduler)、(2) 下载器(Downloader)、(3) 爬虫(Spider)、(4) 实体管道(Item Pipeline)、(5) Scrapy引擎(Scrapy Engine)、(6) 中间件

知识点:
1、Scrapy shell 是一个交互终端,使用XPath或CSS表达式,来测试抓取内容;
   启动方法:1)在cmd中:scrapy shell 网址;2)测试response.xpath、response.css等抓取效果;
2、抓取内容有response.xpath(常用,参考)、response.css、response.re(正则提取)等方法;
3、简易流程:爬取(手写爬虫)-》处理数据(管道中,手写代码,比如过滤、存储)
4、自定义中间件:1)下载器中间件:用于自动更换user-agent、IP;   2)爬虫中间件:用于处理输入(response)和输出(items或requests);
5、pipelines.py:实体管道,接收爬取的数据,并进一步处理,比如验证、整理数据、存入数据库、存入文本文件等,注意使用管道前,需要在配置文件中开启:ITEM_PIPELINES 或者 在自定义配置中custom_settings={ITEM_PIPELINES: '...' };
6、items.py:定义数据结构,对抓取的数据结构化,类似于java的bean;
7、settings.py:项目配置文件,比如定义User-Agent、是否遵循robots协议、最大并发量、下载延迟时间等;也可以在爬虫程序中单独配置custom_settings={配置项};参考1

几个创建命名:
创建爬虫项目: scrapy startproject 项目名
创建爬虫程序(进入项目目录):scrapy genspider 爬虫名 爬取域名,此时spider目录下会创建【爬虫名.py】,该文件包含:起始地址 start_url、parse 函数,爬虫逻辑在 parse 中编写;
运行爬虫项目(进入项目目录):scrapy crawl 项目名 或 scrapy crawl 项目名 -o 文件名.json(.jsonlines、.csv、.xml)
备注:爬取通过js动态加载的内容,需要配合selenium使用。


spider类派生了四种子爬虫:
CrawlSpider:常用,可使用【链接提取器】跟进爬取子网页,参考  参考2 参考3XMLFeedSpider:爬取XML文件,比如RSS;CSVFeedSpider:爬取CVS文件;SitemapSpider:爬取网站的sitemap;
创建CrawlSpider爬虫程序scrapy genspider -t crawl 爬虫名 爬取域名



posted on 2020-11-20 08:17  飞哥100  阅读(129)  评论(0)    收藏  举报

导航