【我的Python学习笔记】从基础数据类型到爬虫,后附Python爬虫笔记

文章目录

在这里插入图片描述

Python面向观众式教学:我的逆袭笔记

💖💖💖💕💕💕欢迎来到本博客💕💕💕💖💖💖
.
🎁支持:如果觉得博主的文章写得还说得过去或者博客对您有帮助的话,可以关注一下博主,如果三连收藏支持就更好啦!这就是给予我最大的支持!

🎉🎉Welcome to my blog!🎉🎉

📃个人CSDN博客主页:热爱科技的刘同学🌈🌈🌈

写在前面

通过社区里众人劝说,我想出一期以实用性为主的、半新手适读的笔记。

那么什么是半新手呢?其实版新手就是至少安装了python并且了解了python的三大特点以及python的历史发布版本,门槛比较低,实际上不用了解这些也可以直接阅读本文。

本文除了整合之前文章的一些内容,也新创作了不少。如果读过我之前文章的朋友们可以通过目录跳着看。

(一) python基础数据类型

和其他编程语言一样,python再计算机中操作数据的格式称作 数据类型

在python中分别有 整数(int)浮点数(float)字符串(str)布尔值(bool) 四种数据类型。

一、整数

整数好理解,上过小学的乃至学龄前儿童都该知道,例如:-3、-2、-3、0、1、2、3…

二、浮点数

所谓浮点数,顾名思义,带小数点的数,实际上就是小数,这里只举一例:3.3。

三、字符串

带着一对引号的东西都叫字符串,例如:“3”、“python”、“人生苦短,我用python”

四、布尔值

这里我们还要认识一个以前一直没有接触过的数据类型,它就是布尔值,在布尔值当中只有 True(真)Flase(假) 就可以了。即使之前一直没接触过布尔值,也不会显得太陌生。

type()函数

当我们无法判断一个数属于那种数据类型的时候,我们就需要借助 type()函数 来判断这个数所属的那种数据类型了。

1、具体操作方法

步骤一:先后按住键盘上的 Win 键和 R 键,松开后屏幕上就会弹出下图中的小窗体:

在这里插入图片描述

步骤二:在这个名为”打开“的搜索框中输入 cmd并按下回车(Enter)键,按下回车键后cmd(下文统称"命令行")就打开了;

在这里插入图片描述
步骤三:在命令行中输入命令 python并回车,输入后再输入 type(),然后在括号里输入你像判断的数据就会得到相应的结果了。

2、示例

我们来通过type判断一下 True 的数据类型。结果如下:

在这里插入图片描述
根据我们上面提供出的数据类型的英文和 True 的数据类型可以得出 True是布尔值 的结论。同理,如果括号里是8就会的到 <class ’int’> 的结果, 8是整数 的结论。

当我们需要进行 任意数据转换为整数 的时候,python官方为我们提供了一个名为 int() 的函数来供我们进行数据转换,这个函数我们下面会讲到它。

细心的朋友们可能已经发现了,int就是我们上面讲的整数的英文,也就是说我们要进行 任意数据转换为该数据 的时候,我们只需要将 待转换数据 加上括号,再在括号前加上 将转化数据类型 的英文就可以了。

以上这些就是python当中最基本的文件操作。

(二) python基础语法

一、 识别符

用于 变量、函数、类、模块 等名称。

识别符有如下特定的规则:

  • 由字母、数字和下划线组成;
  • 第一个字符必须是下划线;
  • 大小写敏感;
  • 不能使用关键字。

合法\不合法识别符举例如下:

# 合法识别符
User_ID, user_age, _width, lotus_3
# 不合法识别符
100, 3days, for, $33, a>b

二、 保留字

保留字即关键字,python的一些具有 特殊功能的标识符,不能用作任何识别符名称。

# 导入模块
import keyword

# 查看关键字
keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 
'from', 'continue', 'def', 'del' ......]

三、 注释

程序中被python著十七忽略的一些文本。可以通过注释记录任意想写的内容,通常是代码的说明。

  • 单行注释,以 # 开头
# 第一行注释,没什么讲究
print("Hello world!")  # 第二行注释的井字号需要距离第二行代码两个空格
  • 多行注释,可以用多个 #,也可以用 '''"""
# 第一行注释
# 第二行注释

'''
第三行注释
'''

"""
第四行注释
"""

四、 行与缩进

与其他程序设计语言采用大括号分隔代码块不同的是,python采用代码缩进来区分代码块之间的层次。

通常使用 空格 或者 Tab 键 来实现。但无论是手动敲空格,还是使用 Tab键,通常情况下都采用4个空格长度作为一个缩进量。(4空格 = 1Tab键)

举个例子:

a = 1

if a == 1:
	print(1)  # 这里是四个空格长度的缩进,是正常的
else:
  print(2) # 这里是两个空格长度的缩进,是会报错的

五、 多行语句

python通常是一行写完一条语句,如果语句很长,我们可以用反斜杠来实现多行语句。

total = num_1 + \
		num_2 + \
		num_3

在所有括号中的多行语句不需要使用反斜杠。

total = ['num_1',
		 'num_2',
		 'num_3']

当然了,像以上情况不常出现,建议大家能不用多行语句,就不用多行语句。

六、 int() 、input()函数

1、 int()函数

int() 函数的作用是把 不同进制数字或数字字符串 转为 十进制整数

例如:

在这里插入图片描述

2、 input()函数

input()函数接受一个标准输入数据,返回为 string 类型

例如:

name = input('请输入你的名字:')
print(name, type(name))

运行结果为:

在这里插入图片描述

七、 print()函数

print() 函数用于打印输出,相信大家的第一个 python 程序一定都是由 print() 函数编写出来的 “Hello world!” 程序吧!所以,这里就不过多说了,包括 转定义字符 在内,如果大家对转定义字符感兴趣可以前往文章 python文件操作 阅读详细,里面有关于转定义字符的详细内容和两张对照表。

八、 if 、else 、elif 语句

if 语句通过判断表达式是否为真,并且在表达式为真时执行该语句下方的代码块的一种 python语句,而 else 语句就是写在 if 语句下面的与 if 语句条件判断相反的 python 语句,并且 else 继承 if 语句的表达式,也就是说 else 语句中的 else 后不需要写表达式比如说:if 语句为 True的时候,else语句就应该为 False。其结构如下:

if 表达式:
	代码块
elif 表达式:
	代码块
else:
	代码块

1、if 语句判断

Created with Raphaël 2.2.0 关键字 判断条件表达式 判断为真时的代码块

2、示例:判断年龄段

year = int(input('请输入您的出生年份:'))

if year >= 2000 <= 2010:
    print('零零后')
elif year >= 1990 <= 2000:
    print('九零后')
elif year >= 1980 <= 1990:
    print('八零后')
elif year > 2010:
    print('儿童')
elif year < 1980:
    print('中老年人')

九、变量

像变量这种东西非常简单,只要注意不要和 关键字保留字 撞车、所有字母都小写、所有单词之间用下划线隔开就行。

我们就变量的组成举个例子:

a = 3
b = c
a = b

上面的例子中,变量名a 、b、c的值都是3,当然,这只是一个简单的例子,像变量这种这种既简单又常用且不可忽略的存在我们就不多举例了,在后面讲的函数中会经常用的。

十、 练习

1、 题目

使用 print() 函数int() 函数input() 函数if语句 制作一个可以通过用户的出生年份判断该用户的生肖以及该用户出生年份的运势的控制台程序。在测试中该用户的出生年份为2018年,运势可以只写2018年一个。

2、 解题提示

2018年为狗年,所以在运势输出中务必写狗年。

3、 答案

(1) 代码
chinese_zodiac = '猴鸡狗猪鼠牛虎兔龙蛇马羊'

year = int(input('请输入您的出生年份:'))

print(chinese_zodiac[year % 12])

if (chinese_zodiac[year % 12]) == '狗':
    print('狗年运势。。。')

(2) 运行结果

在这里插入图片描述

十一、for循环和while循环

在逻辑判断中我们除了if语句外还会接触到另外两个判断语句,它们就是for循环和while循环。

for循环的构成:

for 迭代变量 in 可迭代对象:
	代码块

while循环的构成:

while 表达式:
	代码块

在上面的两种结构中有一个概念,这个概念就是“迭代”,以下内容就是百度百科中的“迭代”:重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”。

值得一提的并不是迭代,而是while循环朴实无华的身躯下隐藏的工作原理。

while循环的工作原理就是当表达式为真时,不断地执行代码块;当表达式为假时,while循环停止工作。

示例

1、题目要求

以数字累加为例,从5开始累加,并且以1秒为间隔时间输出在控制台,累加至11便终止程序。

2、题目分析
  1. 先说从5开始累加,这里需要用到变量,变量名我们命名为 num,给它赋值为5;
  2. 数字累加就需要用到while循环;
  3. 以1秒为间隔时间输出需要用到一个名为 time 的模块中的 sleep 函数。
  4. 终止程序需要if语句的条件判断,除了条件判断外还需要 break 语句,break 语句是用来终止while循环的。
3、代码实现
import time

num = 5
while True:
    num = num + 1

    if num == 11:
        break

    print(num)
    time.sleep(1)

4、运行结果

在这里插入图片描述

十二、元组、列表

这里为了丰富一下这里的笔记,我们将不再使用生肖作为案例,我们可以用星座替代它。

星座和生肖有很大的不同,星座是三个字,而生肖却只有一个字。这个时候如果用字符串来存放星座就会很不方便了。也就是说,在这里我们需要用元组来实现,用列表来优化。

1、元组

元组看起来和字符串扯不上什么关系,实际上字符串、元组、列表同属于序列。既然话都说到这里了,就让我们来看一下元组是怎样的一种写法吧:

("abc", "def")

元组其实就是括号里面的许多字符串,每个字符串中间用逗号隔开,没有什么讲究,值得一提的也只有元组的用法了。

抛开元组,我们来看一下十二星座:

摩羯座、水瓶座、双鱼座、白羊座、金牛座、双子座、巨蟹座、狮子座、处女座、天秤座、天蝎座、射手座

和上面的生肖一样,我们将后三个前置,摩羯座并不是第一个星座,白羊座才是,请大家不要误会。

像上面那种格式写十二星座肯定是不行的,我们用元组给它优化一下:

zodiac_name = (u"摩羯座", u"水瓶座", u"双鱼座", u"白羊座", u"金牛座", u"双子座", 
               u"巨蟹座", u"狮子座", u"处女座", u"天秤座", u"天蝎座", u"射手座")
zodiac_days = ((1, 20), (2, 19), (3, 21), (4, 21), (5, 21), (6, 22), 
               (7, 23), (8, 23), (9, 23), (10, 23), (11, 23), (12, 23))

上面元组中的字母u的功能谈不上复杂,我们后面再给大家详细讲解,这里字母u的功能主要就是防止用了以后出现乱码。

元组 zodiac_days 中存放的都是十二星座的始末日期,这里的存放所用到的就是元组的嵌套功能,也就是说每一个日期就相当是一个元组,所谓嵌套,其详细不言而喻。

示例
(1) 题目

取出比4月10日晚的第一个星座。

(2) 代码
zodiac_name = (u"摩羯座", u"水瓶座", u"双鱼座", u"白羊座", u"金牛座", u"双子座",
               u"巨蟹座", u"狮子座", u"处女座", u"天秤座", u"天蝎座", u"射手座")
zodiac_days = ((1, 20), (2, 19), (3, 21), (4, 21), (5, 21), (6, 22),
               (7, 23), (8, 23), (9, 23), (10, 23), (11, 23), (12, 23))

(month, day) = (4, 10)
zodiac_day = filter(lambda x: x <= (month, day), zodiac_days)

zodiac_len = len(list(zodiac_day)) % 12

print(zodiac_name[zodiac_len])

(3) 运行结果

在这里插入图片描述

(4) 提示

上面代码中的 lambda 我想把它放到下面的 函数 里讲,想了解的朋友们可以先看看。

2、列表

上面我们提了一下列表,列表相较于元组的好处就是可以进行增加或者修改,并且,列表的定义和元组差不多。

我们现在定义一个列表,第一个元素叫 'abc',第二个元素叫 'xyz'

list_first = ['abc', 'xyz']

上面我们说过列表是可以增加的,列表里的这个功能就叫 append ,代码如下:

list_first = ['abc', 'xyz']
list_first.append('ABC')
print(list_first)

现在我们通过运行来验证一下append的功能:

在这里插入图片描述

如果想移除某个元素的话可以使用列表中的 remove 功能,这里就不上代码了,有点儿浪费时间。

(三) Python基础函数

一、函数的创建与调用

1、 概念

执行特定任务和完成特定功能的一段代码。

2、 作用

  • 复用代码;
  • 隐藏实现功能;
  • 提高可维护性;
  • 提高可读性,便于调试。

3、 创建

函数结构:

def 函数名(形式参数\形参名):
	函数体
	return XXX

举个例子:

def clac(a, b):
	c = a+b
	return c

下图画出了上面例子当中名为 clac 的函数的工作原理:

在这里插入图片描述

二、函数的参数与传递

1、 位置传参

根据形参对应 位置 进行实参传递。

2、 关键字传参

根据形参 名称 进行实参传递。

3、 参数传递内存分析

在函数的调用中,进行参数传递:
(1)如果是 不可变 对象,在函数体中的修改 不会影响 实参的值;
(2)如果是 可变 对象,在函数体中的修改 会影响 实参的值。

举个例子:

def fun(arg1, arg2):
    print('arg1', arg2)
    print('arg2', arg1)
    arg1 = 100
    arg2.apped(101)
    print('arg1', arg1)
    print('arg2', arg2)
    return print(arg1, arg2)

n1 = 12
n2 = [10, 20, 30, 40]
print('n1', n1)
print('n2', n2)
fun(n1, n2)
print(n1)
print(n2)

上例中实参n1就不会因为函数体内调用而发生值的改变。

三、函数返回值

1、 若无需返回值(即执行完成后,无需给调用处提供数据),可省略;
2、 若返回值只有1个,直接返回 原值(类型不发生改变);
3、 若返回值有多个,返回结果为 元组

注意:

  • 函数是否需要返回值应当 视情况而定
  • return 语句是把执行结果返回调用的地方,并返回程序的控制权;
  • 程序遇到的第一个 return 即退出 def 块,不会再运行第二个 return

四、函数的参数定义

(一)函数的默认值参数

1、 函数定义时,给形参设置默认值;
2、 只有与默认值不符合时才会传递,若不指定就按照默认只运行。

举个例子:

def print(self, *args, sep = '', end = '\n', file = None):  # print()默认参数回车

(二)个数可变形参

参数类型适用情况表达形式输出类型
个数可变的 位置 形参定义函数时,可能无法实现确定位置实参的个数,要使用可变的位置形参*元组
个数可变的 关键字 形参定义函数时,可能无法实现确定位置实参的个数,要使用可变的关键字形参**字典

注意:

  • 同一函数中,个数可变的位置形参、个数可变的关键字形参只能分别定义一个,否则会报错;
  • 既然有个数可变的位置形参,也有个数可变的关键字形参,则按照 (*arg1, **arg2) 输入。

五、函数变量的作用域

1、 概念

程序代码能够访问该变量的区域。

2、 分类

(1)局部变量

在函数定义并使用该变量时,之在函数内部有效。

注意:

  • 在函数使用 global 声明时,调用后,会成为全局变量。
(2)全局变量

函数内外都有效。

六、递归函数

1、 概念

在一个函数的函数体内调用了该函数本身。

2、 组成部分

(1)递归调用;
(2)递归终止条件。

3、 递归调用过程

(1)每递推一次函数,都会在栈内分配一个栈帧;
(2)每回归一次函数,都会释放相应空间。

4、 优缺点

(1) 优点

思路、代码简单。

(2) 缺点

占用内存多,效率低。

5、 示例

(1) 计算阶乘
计算阶乘代码
print("------计算阶乘------")
def fac(n):
    if n == 1:
        return n
    else:
        res = n*fac(n-1)
        return res
print(fac(6))

计算阶乘运行结果

在这里插入图片描述

(2) 求斐波那契数列的值
求斐波那契数列代码
print("------求斐波那契数列------")
def fib(n):
    if n == 1:
        return 1
    elif n == 2:
        return 1
    else:
        res = fib(n-1)+fib(n-2)
        return res
print(fib(2))

求斐波那契数列运行结果

在这里插入图片描述

七、python 中 lambda 的用法

1、 介绍

lambda 表达式其实是 python 中的一类特殊的定义函数的形式,使用它可以定义一个 匿名函数

即当你需要一个函数,但又不想费神去命名一个函数,这时候,就可以使用 lambda 了。

2、 语法

lambda [arg1 [,arg, ...... argn]]:expression

注意:

  • 在代码 f = lambda a, b, c: a+ b+ c 中,lambda表示匿名函数;
  • 冒号之前的 a, b, c 表示它们是这个函数的参数。

3、 用法

(1)将函数赋值给一个变量,然后再像一般函数调用;
(2)直接在 lambda 表达式后面传递实参;
(3)将 lambda 嵌套到普通函数中,lambda 函数本身作为 return 的值;
(4)将 lambda 函数作为参数传递给其他函数。

(四) Python基础模块

一、pip

所有python模块都是需要通过pip下载的。一般情况下,安装了python就自带了pip,所以pip除了下面这条命令就没得可讲了:

pip install ***

二、模块引用

模块引用虽然不过是寥寥几行代码,但是其引用方法可谓是五花八门。

我们用tkinter举例,和大家分享一下python模块五花八门的引用方法。

1、import

(1) 普通引用
import tkinter
(2) as重命名
import tkinter as tk

1、from import

(1) 普通引用
from tkinter import ttk
(2) from import *
from tkinter import *

(五) Python控制台应用案例:疫情实时数据管理系统(数据以2020年为例,并非2022年的实时案例)

RealtimeMessageData.py(字典存储数据文件)

#使用字典和列表进行数据初始化
ESData={
    "湖北":[67801,59882,3153],
    "广东":[1415,1332,8],
    "河南":[1274,1250,22],
    "浙江":[1238,1221,1],
    "湖南":[1018,1014,4]
}

MessageManager.py(逻辑文件,大部分函数存放于此)

import RealtimeMessageData as rmd


# 查看当前实时疫情信息
def showCurrentESMessage():
    # 从腾讯新闻网站中使用爬虫实现疫情信息的抓取
    return rmd.ESData


# 添加疫情信息
def addESMessage(province, confirm, health, dead):
    # 检查当前输入的省份在字典中是否存在
    if province not in rmd.ESData:
        rmd.ESData[province] = [confirm, health, dead]
        return True
    else:
        return False


# 实现目标省份疫情信息查询功能
def searchESMessageByProvince(province="湖北"):
    # 保存查询结果
    provinceDict = {}
    # 判断province参数是否存在
    if province not in rmd.ESData:
        provinceDict["湖北"] = rmd.ESData["湖北"]
    else:
        provinceDict[province] = rmd.ESData[province]
    # 返回结果
    return provinceDict


# 更新疫情信息
def updateESMessage(province, **dictData):
    # 判断省份是否存在
    if province in rmd.ESData:
        for item in dictData:
            if item == "confirm":  # 更新确诊人数
                rmd.ESData[province][0] = dictData["confirm"]
            elif item == "health":  # 更新治愈人数
                rmd.ESData[province][1] = dictData["health"]
            elif item == "dead":  # 更死亡诊人数
                rmd.ESData[province][2] = dictData["dead"]
        # 更新成功
        return True
    else:
        # 更新失败
        return False


# 判断省份是否存在
def existsProvince(province):
    if province in rmd.ESData:
        return True
    else:
        return False

Menu.py(菜单初始化)

# 导入菜单模块
import MessageManager as mm
# 导入sys模块
import sys


# 实现菜单输出
def outputMainMenu():
    print("疫情实时数据管理系统")
    print("********************************************")
    print("1. 查看当前实时疫情信息")
    print("2. 新增疫情信息")
    print("3. 更新疫情信息")
    print("4. 查看目标城市疫情信息")
    print("5. 退   出")
    print("********************************************")
    number = int(input("请选择:"))
    if number == 1:
        # 查看当前实时疫情信息
        print("************查看当前实时疫情信息*************")
        print("省份\t\t确诊\t\t治愈\t\t死亡")
        # 调用查看当前实时疫情信息
        data = mm.showCurrentESMessage()
        for key in data:
            print(f"{key}\t\t", end="")
            for item in data[key]:
                print(f"{item}\t\t", end="")
            print("")
        print("********************************************")
    elif number == 2:
        # 新增疫情信息
        print("***************新增疫情信息*****************")
        province = input("请输入省份:")
        confirm = int(input("请输入累计确诊人数:"))
        health = int(input("请输入治愈人数:"))
        dead = int(input("请输入死亡人数:"))
        isOK = mm.addESMessage(province, confirm, health, dead)
        if isOK:
            print("添加成功!")
        else:
            print("添加失败, 当前省份已经存在!")
    elif number == 3:
        # 更新疫情信息
        print("***************更新疫情信息****************")
        province = input("请输入要更新的省份:")
        if mm.existsProvince(province):
            # 1. 初始化循环变量
            flag = "y"
            while flag == "y":
                num = int(input("请选择更新的具体信息:0. 确诊人数   1. 治愈人数   2. 死亡人数:"))
                if num == 0:
                    confirm = int(input("请输入确诊人数:"))
                    if mm.updateESMessage(province, confirm=confirm):
                        print("更新成功!")
                    else:
                        print("更新失败!")
                elif num == 1:
                    health = int(input("请输入治愈人数:"))
                    if mm.updateESMessage(province, health=health):
                        print("更新成功!")
                    else:
                        print("更新失败!")
                elif num == 2:
                    dead = int(input("请输入死亡人数:"))
                    if mm.updateESMessage(province, dead=dead):
                        print("更新成功!")
                    else:
                        print("更新失败!")
                flag = input("是否继续?(y/n):")
        else:
            print("当前输入的省份不存在, 请选择新增功能!")
        print("********************************************")
    elif number == 4:
        # 查看目标省份的疫情信息
        print("** ** ** ** ** ** 查看目标省份疫情信息 ** ** ** ** ** ** *")
        answer = "y"
        while answer == "y":
            province = input("请输入要查询的省份:")
            # 执行查询功能
            provinceDict = mm.searchESMessageByProvince(province)
            if "湖北" in provinceDict:
                print(f"您输入的{province}不存在, 为您提供湖北实时数据")
                print("湖北", end="\t\t")
                for item in provinceDict["湖北"]:
                    print(item, end="\t\t")
            else:
                print(province, end="\t\t")
                for item in provinceDict[province]:
                    print(item, end="\t\t")
            answer = input("\n是否继续?(y / n):")
    elif number == 5:
        print("谢谢使用")
        # 退出程序
        sys.exit(1)


# 返回上一级菜单
def returnMainMenu():
    # 1. 初始化循环变量
    answer = "0"
    while answer == "0":
        # 在本部模块中调用函数--输出主菜单
        outputMainMenu()
        answer = input("输入0返回主菜单:")
    else:
        print("输入错误,程序终止!")

main.py(主程序,没什么可说的)

# 导入菜单模块
import Menu

# 返回上一级菜单
Menu.returnMainMenu()

(六) 学姐的Python爬虫笔记图片(懒得写了😭)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(六) 写在最后

都看到这儿来,不给作者一个三连算不算是吃了一顿"霸王餐"呢?

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生产队的小刘

打赏即动力,打赏即鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值