美文网首页
Ch1 Python零基础语法入门

Ch1 Python零基础语法入门

作者: OzanShareing | 来源:发表于2018-09-04 11:26 被阅读0次

    概要


    本文我想拣些使用频率相对高些的基础语法来讲讲,权当作备忘录了吧。

    类别:

    • Python 和 Pycharm的安装
    • 变量和字符串
    • 函数与控制语句:Python循环、判断语句
    • Python数据结构:列表、字典、元组和集合
    • Python文件操作:使用Python建立文件并写入数据
    • Python面向对象:类的定义和使用方法。

    正文


    1. Python安装

    当前主流的Python版本为2.x3.x。由于Python 2 第三方库更多(很多库没有向Python 3转移),企业普遍使用Python 2。如果作为学习和研究的话,建议使用Phthon 3。

    Win 7下安装Python 3.7 就直接参照我另一篇简文:安装Python 3.7

    Linux下安装Python 3

    大部分Linux系统内置了Python 2 和Python 3 ,通过在终端输入python -version
    可以查看当前Python 3的版本。如果需要安装某个特定版本的Python,可以在终端中输入:

    sudo apt-get install python3.7
    

    2. 变量和字符串

    由于Python爬虫的对象大部分为文本,所以字符串的用法尤为重要。

    在Python中,字符串由双引号或单引号和引号中的字符组成。

    首先看看字符串的“加法”:

    a = 'I'
    b = ' love'
    c = ' Python'
    print(a + b + c)
    
    

    在爬虫代码中,会经常构造URL
    例如:在爬取一个网页链接时,只有一部分/u/9104ebf5e177,这部分链接是无法访问的,还需要“http://www.jianshu.com”,这时可以通过字符串的加法进行合并。

    Python 的字符串不仅可以相加,也可以乘以一个数字

    a = "word"
    print(a * 3)
    #wordwordword
    

    字符串乘以一个数字,表示字符串复制的份数。

    3.字符串的切片和索引

    字符串的切片和索引就是通过string[x],获取字符串的一部分信息:

    a = "I love Python"
    print(a[0])
    #I
    print(a[0:5])
    #I lov
    print(a[-1])
    #n
    

    在爬虫实战中,经常会通过字符串的切片和索引,提取需要的部分,剔除一些不需要的部分。

    4.字符串方法

    Python作为面向对象的语言,每个对象都有相应的方法,字符串也一样,拥有多种方法,在这里介绍爬虫技术中常用的几种方法。

    ① split()方法

    a = "www.baidu.com"
    print(a.split("."))
    #['www', 'baidu', 'com']
    

    字符串的split()方法就是通过给定的分隔符('.'),将一个字符串分割为一个列表

    如果没有提供任何分隔符,程序会把所有的空格作为分隔符(空格、制表、换行等)

    ② replace()方法

    a = "there is apples"
    b = a.replace("is", "are")
    print(b)
    #there are apples
    

    这种方法类似于文本中的“查找和替换”功能。

    ③ strip()方法

    a = "python is cool "
    print(a.strip())
    #python is cool
    

    strip()方法返回去除两侧(不包含内部)空格的字符串,也可以指定需要去除的字符。将它们列为参数中即可。

    a = "***python *is * good***"
    print(a.strip('*'))
    #python *is * good
    

    这个方法只能去除两侧的字符,在爬虫得到的文本中,文本两侧常会有多余的空格,只需使用字符串的strip()方法即可去除多余的空格部分。

    ④format()方法

    最后再讲解下好用的字符串格式化符,首先看以下代码:

    a = "{} is my love".format('Python')
    print(a)
    #Python is my love
    

    字符串格式化符就像是做选择题,留了空给做题者选择。

    在爬虫过程中,有些网页链接的部分参数是可变的,这时使用字符串格式化符可以减少代码的使用量。

    例如:Pexels素材网(https://www.pexels.com/),当搜索图片时,网页链接也会发生变化,如在搜索栏中输入“book”,网页跳转为“https://www.pexels.com/search/book/”,可以设计如下代码,笔者只需输入搜索内容,便可返回网页链接。

    content = input("请输入搜索内容:")
    url_path = 'https://www.pexels.com/search/{}/'.format(content)
    print(url_path)
    #https://www.pexels.com/search/book/
    

    介绍Python的判断和循环两种爬虫技术中常用的控制语句

    1.函数

    Python中定义函数的方法:

    def 函数名(参数1,参数2...):
        return "结果"
    

    制作一个输入直角边就能计算出直角三角形的面积函数:

    def function(a, b):
        return 1 / 2 * a * b
    
    print(function(1, 2))
    

    来做一个综合练习,读者都知道网上的电话号码 156****9354,中间的数值使用其他符号代替了,而用户输入的时候是完整地输入,下面通过使用函数来实现这个功能:

    def change_number(number):
        hiding_number = number.replace(number[3:7], '*' * 4)
        print(hiding_number)
    
    
    change_number("15674439354")
    #156****9354
    

    2.判断语句

    在爬虫实战中也会经常使用判断语句,Python的判断语句格式如下:

    if condition:
        pass
    else:
        pass
    #冒号和缩进不要忘记了
    
    #再看一下多重条件的格式
    if condition:
        pass
    elif condition:
        pass
    else:
        pass
    

    在平时使用密码时,输入的密码正确即可登录,密码错误时就需要再次输入密码。

    def count_login():
        password = input("password:")
        if password == '12345':
            print("输入成功!")
        else:
            print("错误,再输入:")
            count_login()
    
    
    count_login()
    

    3.循环语句

    Python的循环语句包括for循环和while循环,代码如下:

    #for 循环
    for item in iterable:
        pass
    #item表示元素,iterable是集合
    for i in range(1,11):
        print(i)
    #输出1到10间的整数
    
    #while 循环
    while condition:
        pass
    

    例如,设计一个小程序,计算1~100的和:

    i = 0
    sum = 0
    
    while i < 100:
        i += 1
        sum += i
    print(sum)
    #5050
    

    Python 数据结构是存放数据的容器。

    1.列表

    在爬虫实战中,使用最多的就是列表数据结构,不论是构造出的多个URL,还是爬取到的数据,大多数都为列表数据结构。

    下面首先介绍列表最显著的特征:

    • 列表中的每一个元素都是可变的。

    • 列表的元素是都是有序的,也就是说每个元素都有对应的位置(类似字符串的切片和索引)

    • 列表可以容纳所有的对象

    列表中的每个元素都是可变的,这意味着可以对列表进行增删改操作,这些操作在爬虫中很少使用,因此不再给读者添加知识负担。

    list = ["peter", "lilei", "wangwu", "xiaoming"]
    print(list[0])
    print(list[2:])
    #peter
    #['wangwu', 'xiaoming']
    

    如果为切片,返回的也是列表的数据结构。

    列表可以容纳所有的对象

    list = [1, 1.1, 'string', print(1), True, [1, 2], {'key', 'value'}]
    

    列表中会经常使用到多重循环,因此有必要了解和使用多重循环。现在有两个列表,分别是姓名和年龄的列表:

    names = ['xiaoming', 'wangwu', 'peter']
    ages = [23, 15, 58]
    

    这时可以通过多重循环让 name 和 age 同时打印在屏幕上

    names = ['xiaoming', 'wangwu', 'peter']
    ages = [23, 15, 58]
    for name, age in zip(names, ages):
        print(name, age)
    #xiaoming 23
    #wangwu 15
    #peter 58
    

    在爬虫中,经常请求多个网页,通常情况下会把网页存到列表中,然后循环依次取出并访问爬取数据。这些网页都有一定的规律,如果是手动将这些网页URL存入到列表中,不仅花费太多时间,也会造成代码冗余。这时可通过列表推导式,构造出这样的列表,例如某个网站每页的URL是这样的(一共13页)

    http://bj.xiaozhu.com/search-duanzufang-p1-0/
    http://bj.xiaozhu.com/search-duanzufang-p2-0/
    http://bj.xiaozhu.com/search-duanzufang-p3-0/
    http://bj.xiaozhu.com/search-duanzufang-p4-0/
    ......
    

    通过以下代码即可构造出13页URL的列表数据:

    urls = ['http://bj.xiaozhu.com/search-duanzufang-p{}-0/'.format(number) for number in range(1, 14)]
    
    for url in urls:
        print(url)
    

    通过一行代码即可构造出来,通过for循环打印出每个URL

    http://bj.xiaozhu.com/search-duanzufang-p1-0/
    http://bj.xiaozhu.com/search-duanzufang-p2-0/
    http://bj.xiaozhu.com/search-duanzufang-p3-0/
    http://bj.xiaozhu.com/search-duanzufang-p4-0/
    http://bj.xiaozhu.com/search-duanzufang-p5-0/
    http://bj.xiaozhu.com/search-duanzufang-p6-0/
    http://bj.xiaozhu.com/search-duanzufang-p7-0/
    http://bj.xiaozhu.com/search-duanzufang-p8-0/
    http://bj.xiaozhu.com/search-duanzufang-p9-0/
    http://bj.xiaozhu.com/search-duanzufang-p10-0/
    http://bj.xiaozhu.com/search-duanzufang-p11-0/
    http://bj.xiaozhu.com/search-duanzufang-p12-0/
    http://bj.xiaozhu.com/search-duanzufang-p13-0/
    

    2.字典

    Python的字典数据结构与现实中的字典类似,以键值对('key'--'value')的形式表现出来。

    user_info = {'name': 'xiaoming', 'age': 23, 'sex': 'man'}
    
    for key, value in user_info.items():
        print(key, value)
    
    

    注意:插入MongoDB数据库需用字典结构

    3.元组和集合

    在爬虫中,元组和集合很少用到,因此这里只做简单介绍。元组类似于列表,但是元组的元素不能修改只能查看,元组的格式如下:

    tuple = (1,2,3)
    

    集合的概念类似于数学中的集合。每个集合中的元素是无序的,不可以有重复的对象,因此可以通过集合把重复的数据去除。

    lists = ['xiaoming', 'zhangyun', 'xiaoming']
    sets = set(lists)
    print(sets)
    #{'xiaoming', 'zhangyun'}
    

    注意:集合是用大括号构建的。


    在爬虫初期的工作中,常常会把数据存储到文件中。

    主要讲解Python如何打开文件和读写数据

    1.打开文件

    Python中通过open()函数打开文件,语法如下:

    open(name[,mode[,buffering]])
    

    open()函数使用文件名作为唯一的强制参数,然后返回一个文件对象。模式(mode)和缓冲(buffering)是可选参数。

    在Python的文件操作中,mode参数的输入是有必要的,而buffering使用较少。

    如果在本机上有名为file.txt的文件,其存储路径为C:\Users\Admin\Desktop,那么可以通过下面代码打开文件:

    f = open("C:/Users/Admin/Desktop/file.txt")
    

    注意:此代码为Windows系统下的路径写法

    如果文件不存在,则会出现如下图所示的错误:

    文件不存在报错信息

    如果open()函数只是加入文件的路径这一个参数,则只能打开文件并读取文件的相关内容。

    如果想要文件中写入内容,则必须加入模式这个参数了。下面看看open()函数中模式参数的常用值:

    描述
    'r' 读模式
    'w' 写模式
    'a' 追加模式
    'b' 二进制模式(可添加到其他模式中使用)
    '+' 读/写模式(可添加到其他模式中使用)

    2.读写文件

    可以通过f.write()方法和f.read()方法写入和读取数据了。

    f = open("data.txt", 'r+', encoding="utf8")
    f.write("hello world!")
    

    注意:如果没有建立文件,运行上面代码也可以成功,如果模式为r+w+,只会覆盖原先的内容。

    如果再次运行程序,txt文件中的内容不会继续添加,可以修改模式参数为'r+',便可一直写入文件。

    Python读取文件通过read()方法,下面尝试把f的类文件对象写入的数据读取出来,使用如下代码即可完成。

    f = open("data.txt", 'r', encoding="utf8")
    content = f.read()
    print(content)
    

    3.关闭文件

    当完成读写工作后,应该牢记使用close()方法关闭文件。这样可以保证Python进行缓冲的清理(出于效率考虑而把数据临时存储在内存中)和文件的安全性。

    f = open("data.txt", 'r', encoding="utf8")
    content = f.read()
    print(content)
    f.close()
    

    Python作为一个面向对象的语言,很容易创建一个类和对象。

    1.定义类

    类是用来描述具有相同属性和方法的对象集合。人可以通过不同的肤色划分为不同的种族,事物也有不同的种类,商品也是形形色色。但划分为同一类的物体,肯定具有相似的特征和行为方式。

    对于同一款自行车而言,他们的组成结构都是一样的,如车架、车轮和脚踏板等。通过Python可以定义这个自行车的类:

    class Bike:
        compose = ['frame', 'wheel', 'pedal']
    

    通过使用class定义一个自行车的类,类中的变量compose 称为类的变量,专业术语为类的属性。这样,顾客购买的自行车组成结构就是一样的了。

    my_bike = Bike()
    your_bike = Bike()
    print(my_bike.compose)
    print(your_bike.compose)
    

    在左边写上变量名,右边写上类的名称,这个过程称之为类的实例化,而my_bike就是类的实例。通过.加上类的属性,就是类属性的引用。类的属性会被类的实例共享,所以结果都是一样的。

    2.实例属性

    对于同一款自行车,有些顾客买回去后会改造下:

    class Bike:
        compose = ['frame', 'wheel', 'pedal']
    
    my_bike = Bike()
    my_bike.other = 'basket'
    print(my_bike.other)
    

    说明:通过给类的实例属性进行赋值,也就是实例属性。compose属性属于所有的该款自行车,而other属性只属于my_bike这个类的实例。

    3.实例方法

    是否记得字符串的format()方法。方法就是函数,方法是对实例进行使用的,所以又叫实例方法。对于自行车而言,它的方法就是骑行:

    class Bike:
        compose = ['frame', 'wheel', 'pedal']
    
        def use(self):
            print("you are riding")
    
    
    my_bike = Bike()
    my_bike.use()
    

    和函数一样,实例方法也是可以有参数的。

    class Bike:
        compose = ['frame', 'wheel', 'pedal']
    
        def use(self, time):
            print("you ride {}m".format(time * 100))
    
    
    my_bike = Bike()
    my_bike.use(10)
    

    Python的类中有一些“魔法方法”,__init__()方法就是其中之一。在我们创建实例的时候,不需要引用该方法也会被自动执行。

    class Bike:
        compose = ['frame', 'wheel', 'pedal']
    
        def __init__(self):
            self.other = 'basket'
    
        def use(self, time):
            print("you ride {}m".format(time * 100))
    
    
    my_bike = Bike()
    my_bike.use(10)
    

    4.类的继承

    共享单车的出现,方便了人们的出行,共享单车和原来的自行车组成结构类似,但多了付费的功能。

    class Bike:
        compose = ['frame', 'wheel', 'pedal']
    
        def __init__(self):
            self.other = 'basket'
    
        def use(self, time):
            print("you ride {}m".format(time * 100))
    
    
    class Share_bike(Bike):
        def cost(self, hour):
            print('you spent {}'.format(hour * 2))
    
    
    bike = Share_bike()
    print(bike.other)
    bike.cost(2)
    

    在新的类Share_bike后面的括号中加入Bike,表示Share_bike继承了Bike父类。父类中的变量和方法完全被子类继承,在特殊情况下,也可以对其覆盖。

    相关文章

      网友评论

          本文标题:Ch1 Python零基础语法入门

          本文链接:https://www.haomeiwen.com/subject/aokgwftx.html