Python爬虫划水

Python

​ 本周主要学习了Python的基础语法。主要包括数据类型、条件、循环语句,以及列表、元组、集合以及字典

变量

  1. 什么是变量?

    变量即可以变化的量,量指的是事物的状态

  2. 为什么要有变量?

    程序的执行本质 就是一系列状态的变化 是程序执行的直接体现

    所以我们需要有一种机制能够反应或者说保存下来程序执行时的状态以及状态的变化

  3. 如何使用变量?

    变量的使用必须要满足一个前提条件 先定义后使用

    name = 'jason'
    age = 18
    height = 183
    weight = 150
    """
    name = 'jason'
    在内存中申请一块内存空间然后将jason存入进去
    之后给该内存空间绑定一个门牌号name
    之后如果你想访问到内存中的数据必须通过门牌号即变量名的形式访问
    """
    
  4. 变量类型

    • 整型int
    • 浮点型float
    • 字符串类型str
    • 列表类型list
    • 字典类型dict
    • 布尔值bool
    • 元组tuple
    • 集合set

    变量名的定义规范

    1. 变量名只能是数字 字母 下划线的任意组合

    2. 数字不能开头

    3. 关键字不能作为变量名

    变量名的书写规范

    1. 驼峰体 js推荐使用的方式

      AgeOfJason = 18

    2. 下划线 python推荐使用的方式
      age_of_jason = 18
      变量名要尽量做到见名知意
      变量名不要用拼音(尽量不要用)

    书写python代码尽量符合PEP8规范
    最好能达到在纸上写或者在一个普通的文本文件中书写python代码也是符合规范的

    变量三要素

    1. id 类似于内存地址
    2. type 变量名指向的数据的数据类型
    3. value 变量名指向的数据的值

    小整数池的概念

    a = 4
    print(id(a))  # 4543645840
    x = 3
    print(id(x))  # 4543645808
    x = x + 1
    print(id(x))  # 4543645840
    

python实现int的时候有一个小整数池,为了避免与创建相同的值而重复的申请内存空间所带来的效率问题
范围:-5~256之间

常量

  1. 什么是常量?
    在程序运行过程中不会改变的量
  2. 为什么要有常量?
    程序运行过程中,有些值是固定的,不应该被改变
    1. 配置文件配置
    2. 圆周率
  3. 怎么使用常量?
    同变量的使用

在python中我们将全大写的变量看成是常量

HOST = '127.0.0.1'

"""
在python中没有真正意义上的常量!!!
可以修改但是在修改之前我们会额外的考虑一些修改之后可能带来的结果和影响
"""

条件/分支结构

if 条件1:
代码
elif 条件2:
代码

else:
代码

if username == 'jason' and password == '123':
	print('登陆成功')  # 应该结束循环
else :
    print('请重新输入')

循环

循环结构就是**重复的执行某段代码块**

while循环(条件循环)

语法结构
while 条件:
代码1
代码2
代码3

# 给用户三次登陆错误的机会 三次没过则结束循环
flag = True
while flag:
    username = input("username>>>:")
    password = input('password>>>:')
    # 校验数据                链接数据库查询
    if username == 'jason' and password == '123':
        print('登陆成功')  # 应该结束循环
        # break  # 结束本层循环(在break上面离break最近的那一个while循环)
        while flag:
            cmd = input('please input you command>>>:')
            if cmd  == 'exit':
                flag = False
            print('正在执行你的命令:%s'%cmd)
    else:
        print('用户名或密码错误')
for循环

for循环能够做的事情while循环都可以做,但是for循环再遍历取值方面比while更加的简单

for 变量名 in 可迭代对象: (字符串/列表/字典) 后面再详细将
代码1
代码2
代码3

# 打印1-5
count = 1
while count < 6:
    print(count)
    count += 1
# 用循环输出字符串
s = 'hello world'
for i in s:
    print(i)

列表

列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。

列表的数据项不需要具有相同的类型

创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示:

list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5 ]
list3 = ["a", "b", "c", "d"]

解压赋值

l = [111,222,333,444]
x = l[0]
y = l[1]
z = l[2]
o = l[3]
print(x,y,z,o)
a,b,c,d = l  # 左右两边个数一致
print(a,b,c,d)
e,f = l  # too many values to unpack (expected 2)
g,h i,j,k = l  # not enough values to unpack (expected 5, got 4)

m,*_ = l
print(m,_)
n,*_,n1 = l
print(n,_,n1)  # 111 [222, 333] 444

内置方法

索引取值
l = ['jason', 'egon', 'tank', 111, 222, 333]
print(l[0])
索引改值
l = ['jason', 'egon', 'tank', 111, 222, 333]
l[1] = 'xiaolj'
print(l)
切片操作
l = ['jason', 'egon', 'tank', 111, 222, 333]
print(l[0:5])  # ['jason', 'xiaolj', 'tank', 111, 222]
步长
l = ['jason', 'egon', 'tank', 111, 222, 333]
print(l[0:5:2])  # ['jason', 'tank', 222]
长度
l = ['jason', 'egon', 'tank', 111, 222, 333]
print(len(l))  # 6
给列表添加元素的三种方式
  1. 尾部追加(将括号内的内容以单个元素的形式追加到列表的尾部)

    l = ['jason', 'egon', 'tank', 111, 222, 333]
    l.append(777)
    print(l)  # ['jason', 'egon', 'tank', 111, 222, 333, 777]
    l.append([111,222,333])
    print(l)  # ['jason', 'egon', 'tank', 111, 222, 333, 777, [111, 222, 333]]
    
  2. 任意位置插入

    l = ['jason', 'egon', 'tank', 111, 222, 333]
    l.insert(0,'今天居然要上班')
    print(l)  # ['今天居然要上班', 'jason', 'egon', 'tank', 111, 222, 333]
    l.insert(2,'三天小长假没了')
    print(l)  # ['今天居然要上班', 'jason', '三天小长假没了', 'egon', 'tank', 111, 222, 333]
    
  3. 扩展列表

    l = ['jason', 'egon', 'tank', 111, 222, 333]
    l1 = [111, 222, 333]
    l2 = [333, 444, 555]
    l1.extend(l2)
    print(l1)  # [111, 222, 333, 333, 444, 555]
    
给列表删除元素的三种方法
  1. 通用方法

    l = ['jason', 'egon', 'tank', 111, 222, 333]
    del l[1]
    print(l)  # ['jason', 'tank', 111, 222, 333]
    
  2. 指名道姓的移除某个元素

    l = ['jason', 'egon', 'tank', 111, 222, 333]
    l.remove('tank')
    print(l)  # ['jason', 'egon', 111, 222, 333]
    
  3. 弹出元素

    l = ['jason', 'egon', 'tank', 111, 222, 333]
    l.pop()  # 括号内不写参数 默认移除的是列表尾部的元素
    print(l)  # ['jason', 'egon', 'tank', 111, 222]
    l.pop(1)
    print(l)  # ['jason', 'tank', 111, 222, 333]
    
    """pop的本质 是将指定的元素从列表中取出"""
    
    res = l.pop()
    print(res,l)  # 333 ['jason', 'egon', 'tank', 111, 222]
    res1 = l.remove('egon')
    print(res1)  # None
    
颠倒顺序
ll = [111, 333, 666, 444, 888]
ll.reverse()
print(ll)  # [888, 444, 666, 333, 111]
排序
ll = [111, 333, 666, 444, 888]
# ll.sort()
# print(ll)  # [111, 333, 444, 666, 888]  升序
ll.sort(reverse=True)
print(ll)  # [888, 666, 444, 333, 111]  降序
列表比较大小
l1 = [111, 222, 333, 444, 555]
l2 = [222, ]
print(l1 > l2)  # False
print(l2 > l1)  # True
l1 = ['a', 'b', 'c']
l2 = ['A', ]
print(l1 > l2)  # True  内部会依据ascii码表将英文字符转换成数字再比较
"""
按照索引位置依次比较 一旦决出胜负 不再往后比对
"""
计数
l1 = [111, 222, 111, 111, 111]
print(l1.count(111))  # 4
清空
l1 = [111, 222, 111, 111, 111]
l1.clear()
print(l1)  # []

元组

元组与列表相似 也是可以存储多个任意类型的元素

不同之处在于元组的元素**不能被修改,即元祖相当于不可变**的列表

用于记录多个固定不允许修改的值 单纯的用于查看

元组里面如果只有一个元素 不加逗号的情况下元素是什么类型就是什么类型

#1、元组中只有一个元素
names = ('jason',)
print(type(names))  # <class 'tuple'>
ages = (18,)
print(type(ages))  # <class 'tuple'>

#2、元组中有多个元素
countries = ('中国','日本','美国')
print(type(countries))  # <class 'tuple'>
names = ('jason')
print(type(names))  # <class 'str'>
ages = (18)
print(type(ages))  # <class 'int'>

由于元组内元素默认是不能修改的所以提供给元组的内置方法也很少

t = (111, 222, 333, 444)
print(t[0])
print(t[0:3])
print(t[0:3:2])
print(len(t))
print(111 in t)
for i in t:
    print(i)
print(t.count(111))
print(t.index(222))  # 1  返回指定元素对应的索引值

集合

使用集合只在下面两种情况下使用

  1. 去重

  2. 关系运算
    交叉并集

    se = {1,2,3,4,5,6,7}
    
    s = {}
    print(type(s))  # <class 'dict'>
    d = {}
    print(type(d))  # <class 'dict'>
    # 定义空集合
    se = set()
    print(type(se))  # <class 'set'>
    

去重

集合的去重是有局限性的
1.只能针对不可变类型
2.集合本身是无序的,去重之后无法保留原来的顺序

# lll = ['a', 'b', 1, 'a', 'a']

# s = set(lll)  # 转集合

# # print(s)

# new_l = list(s)

# print(new_l)  # [1, 'a', 'b']

lll = [
    {"username": 'jason', 'age': 18, 'gender': 'male'},
    {"username": 'jack', 'age': 73, 'gender': 'male'},
    {"username": 'tom', 'age': 20, 'gender': 'female'},
    {"username": 'jason', 'age': 18, 'gender': 'male'},
    {"username": 'jason', 'age': 18, 'gender': 'male'},
]

# 给列表中的元素去重 并且保留原来的顺序

new_l = []
for dic in lll:  # 循环获取每一个字典元素
    if dic not in new_l:
        new_l.append(dic)
print(new_l)
"""
输出结果如下
[
    {'username': 'jason', 'age': 18, 'gender': 'male'}, 
    {'username': 'jack', 'age': 73, 'gender': 'male'}, 
    {'username': 'tom', 'age': 20, 'gender': 'female'}
]
"""

字典

字典是另一种可变容器模型,且可存储任意类型对象

字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号(**{})**中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }

键必须是唯一的,但值则不必。

值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。

一个简单的字典实例:

dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}

也可如此创建字典:

dict1 = { 'abc': 456 }
dict2 = { 'abc': 123, 98.6: 37 }

取值

  1. 按key取值(字典是无序的 根本没有索引)

    d = {'username': 'jason', 'password': 123, 'hobby': ['read', 'music', 'study']}
    print(d['username'])
    print(d['xxx'])  # 直接报错
    """字典在取值的时候 一般不推荐使用直接按照key来取"""
    
  2. get取值

    d = {'username': 'jason', 'password': 123, 'hobby': ['read', 'music', 'study']}
    print(d.get('username'))  # jason
    print(d.get('xxx'))  # None
    print(d.get('xxx', '该键不存在'))  # 该键不存在
    

赋值

d = {'username': 'jason', 'password': 123, 'hobby': ['read', 'music', 'study']}
d['age'] = 18  # 无则添加
print(d)  # {'username': 'jason', 'password': 123, 'hobby': ['read', 'music', 'study'], 'age': 18}
d['username'] = 'heiheihei'
print(d)  # 有则修改

求长度

d = {'username': 'jason', 'password': 123, 'hobby': ['read', 'music', 'study']}
print(len(d))  # 3  统计的是字典里面的key:value键值对的个数

删除

d = {'username': 'jason', 'password': 123, 'hobby': ['read', 'music', 'study']}
res = d.pop('password')  # 弹出password对应的键值对
print(res, d)  # 123 {'username': 'jason', 'hobby': ['read', 'music', 'study']}
res = d.popitem()
print(d, res)  # ('hobby', ['read', 'music', 'study'])

内置函数

keys/values/items
d = {'username': 'jason', 'password': 123, 'hobby': ['read', 'music', 'study']}
print(d.keys())  # dict_keys(['username', 'password', 'hobby'])
print(d.values())  # dict_values(['jason', 123, ['read', 'music', 'study']])
print(d.items())  # dict_items([('username', 'jason'), ('password', 123), ('hobby', ['read', 'music', 'study'])])
update
d = {'username': 'jason', 'password': 123, 'hobby': ['read', 'music', 'study']}
d.update({'username': 'tony', 'age':18})
# 有则修改 无则添加
print(d)  # {'username': 'tony', 'password': 123, 'hobby': ['read', 'music', 'study'], 'age': 18}
fromkeys/append
d1 = dict.fromkeys(['k1','k2','k3'],[])
print(d1)  # {'k1': [], 'k2': [], 'k3': []}
d1['k1'].append(111)
# 三个键指向的是同一个列表空间
print(d1)  # {'k1': [111], 'k2': [111], 'k3': [111]}
setdefault
dd = {'k1': 111, 'k2': 222}
res = dd.setdefault('k3', 666)
print(res)  # 666
print(dd)  # {'k1': 111, 'k2': 222, 'k3': 666}
res1 = dd.setdefault('k1', 222)
print(res1, dd)  # 111 {'k1': 111, 'k2': 222}
"键存在则不修改而是获取到键对应的值,键不存在则是添加新的键值对"

name’: ‘tony’, ‘password’: 123, ‘hobby’: [‘read’, ‘music’, ‘study’], ‘age’: 18}


#### fromkeys/append

```python
d1 = dict.fromkeys(['k1','k2','k3'],[])
print(d1)  # {'k1': [], 'k2': [], 'k3': []}
d1['k1'].append(111)
# 三个键指向的是同一个列表空间
print(d1)  # {'k1': [111], 'k2': [111], 'k3': [111]}
setdefault
dd = {'k1': 111, 'k2': 222}
res = dd.setdefault('k3', 666)
print(res)  # 666
print(dd)  # {'k1': 111, 'k2': 222, 'k3': 666}
res1 = dd.setdefault('k1', 222)
print(res1, dd)  # 111 {'k1': 111, 'k2': 222}
"键存在则不修改而是获取到键对应的值,键不存在则是添加新的键值对"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值