用Python爬取妹子图所有大图

昨天我用python写了一个爬取妹子图网站图片的爬虫,是一个非常简陋的爬虫。
下边把我写的烂程序分享给大家,望给我做些评价。
我写的这个程序分为两个python文件,一个用来把图片文章的列表页网址给解析出来保存到一个python的list里边,并且用json库把这个list保存进一个json文件内。另一个python文件是用来解析并且下载图片文章详情页的所有大图。

GIF

第一个python文件(meizitu.py)

 

'''爬取“妹子图”http://www.meizitu.com/ 所有大图
1.列表页面:http://www.meizitu.com/a/more_1.html
*more_{num}.html其中num从1-72
*列表页小图链接在<div class="pic">下边(链接指向详情页面)
2.列表详情页面:http://www.meizitu.com/a/38.html
*{num}.html,其中num是详情页面的id
*大图在<div class="postContent">下边
*大图的img属性中有class="scrollLoading"我们就用这个属性来找到我们需要的图片
*文章标题在<div class="postmeta clearfix">下边
*我们把图片的文件名用文章标题加上数字进行重命名,另外去除标题中的空格和不符合文件名的符号
'''
import requests
from bs4 import BeautifulSoup
import json

list_link_num = 'http://www.meizitu.com/a/more_{num}.html'
list_link = [list_link_num.format(num=i) for i in range(1, 73)]
details_link = []

def get_list_index(list1, lists):
num = lists.index(list1) + 1
return num

def get_list_page_img_link(html):
soup = BeautifulSoup(html, 'lxml')
for link in soup.findAll('div', class_='pic'):
for a in link.findAll('a'):
details_link.append(a.attrs['href'])
print(len(details_link))

for link_list in list_link:
r = requests.get(link_list, headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'})
r.encoding = r.apparent_encoding
print('状态: %s\n' % r.status_code)
print('第 %d 个网页下载成功' %(get_list_index(link_list, list_link)))
get_list_page_img_link(r.text)

with open('./test.json', 'w') as f:
json.dump(details_link, f, indent=4)

f.close()

 

第二个文件(test.py)

import json
import requests
from bs4 import BeautifulSoup
import time

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'}
download_path = 'd://image//'
download_count = 1
#link = []
with open('./test.json', 'r') as f:
link = json.load(f)

f.close()
#print(link)

def writeImage(path, img):
with open(path, 'wb') as f:
f.write(img)
f.close()

for a in link:
r = requests.get(a, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
for img_parent in soup.findAll('div', id='picture'):
for img in img_parent.findAll('img'):
print('正在下载第: %d 张美女的图片' % download_count)
img_link = img.attrs['src']
img_name_list = img_link.split('/')
img_file_name = img_name_list[-4] + img_name_list[-3] + img_name_list[-2] + img_name_list[-1]
#time.sleep(1)
try:
r_img = requests.get(img_link, headers=headers, timeout=10)
r_img.raise_for_status()
except:
print('链接异常')
path = download_path + img_file_name
writeImage(path, r_img.content)
print('第:%d 张美女的图片已下载完成, 赶快去看看吧!' % download_count)
download_count += 1
#print('还剩%d 张没有下载' % len(img_parent.findAll('img')) - download_count)

 

下载后存储的json文件(test.json)

这个文件的内容就不分享了,因为太长了有将近3000行。

图片一共爬取了1.5万多张。

Flask 第三方插件导入方法

我遇到的问题
我在Flask运行是的问题就是,每次运行python manage.py runserver是都会显示一些警告信息,从提示可以看到只是警告信息,并不是错误信息。Google了以下原来是版本不同导致的兼容性问题,解决的办法就是使用新的导入方式即可。

旧的第三方插件导入方式

from flask.ext.sqlalchemy import SQLAlchemy

我们可以在ipython里查看第三方包的包名,按照包名导入即可。

Flask 的项目架构

(flask_env) fy@fy-Box:~/py_project/blog$ tree
.
├── app
│   ├── blog
│   │   ├── errors.py
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── errors.cpython-35.pyc
│   │   │   ├── __init__.cpython-35.pyc
│   │   │   └── views.cpython-35.pyc
│   │   └── views.py
│   ├── __init__.py
│   ├── __pycache__
│   │   └── __init__.cpython-35.pyc
│   ├── static
│   │   ├── css
│   │   ├── img
│   │   └── js
│   └── templates
│   ├── 404.html
│   ├── 500.html
│   ├── base.html
│   └── blog
│   └── index.html
├── config.py
├── manage.py
├── __pycache__
│   └── config.cpython-35.pyc
└── requirements.txt

11 directories, 16 files

app 目录

app 目录是Flask 的应用目录,里边包括templates\static和一些蓝图,蓝图可以有多个,但这里只有blog一个,蓝图里就是一些视图函数。

app/init.py
from flask import Flask
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy

# 导入配置文件
from config import config

bootstrap = Bootstrap()
db = SQLAlchemy()

def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)

bootstrap.init_app(app)
db.init_app(app)

# Bluerpint
from .blog import blog as blog_blueprint
app.register_blueprint(blog_blueprint)
return app

blog/config.py

import os

base_dir = os.path.abspath(os.path.dirname(__file__))

class Config(object):
'''
Base Config
'''
SECRET_KEY = 'ABCDEFG'
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
SQLALCHEMY_TRACK_MODIFICATIONS = True

@staticmethod
def init_app(app):
pass

class DevConfig(Config):
'''
Development Config
'''
DEBUG = True
HOST = '0.0.0.0'
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(base_dir, 'data-dev.sqlite')

config = {
'development': DevConfig,
'default': DevConfig
}

blog/manage.py

import os
from app import create_app
from flask_script import Manager

app = create_app('default')
manage = Manager(app)

if __name__ == '__main__':
manage.run()

app/blog/init.py

from flask import Blueprint

blog = Blueprint('blog', __name__)

from . import views, errors

app/blog/errors.py

from flask import render_template
from . import blog

@blog.app_errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404

@blog.app_errorhandler(500)
def internal_server_error(e):
return render_template('500.html'), 500

app/blog/views.py

from flask import render_template

from . import blog

@blog.route('/')
def index():
return render_template('blog/index.html')
templstes/base.html
{% extends "bootstrap/base.html" %}
{% block title %}疯影{% endblock %}

{% block content %}
<div class="container">
{% block page_content %}base.html{% endblock %}
</div>
{% endblock content %}

 

 

流畅的python–第一章 数据模型

Guido 对语言设计美学的深入理解让人震惊。我认识不少很不错的
编程语言设计者,他们设计出来的东西确实很精彩,但是从来都不
会有用户。Guido 知道如何在理论上做出一定妥协,设计出来的语
言让使用者觉得如沐春风,这真是不可多得。

——Jim Hugunin
Jython 的作者,AspectJ 的作者之一,.NET DLR 架构师

Python是我最喜欢的编程语言,可能是Python的风格吸引了我,比如获取一个字符串的长度可以用len(str),其他语言的风格可能是str.len()咳咳!

Python最好的品质就是一致性,这是这本书上说的,我的理解就是比如:我们可以用len获取大多数对象的长度,如,字符串,列表,元组,还有我们自定义的类通过实现__len__()也可以实现同样的特性,这样就保持了程序的一致性。这就是所谓的”Pythonic”吧。

python的数据模型

本书第一章讲的就是Python 的数据模型,因为数据模型是Python的核心组成。我的理解是Python的数据模型就是为了创建Python风格,而创建的个个组件,比如每个对象的底层都有很多的类似__len__()这样带前后双下划线的方法。这些方法赋予了Python魔力。Python的设计思想非常的有特色,通过慢慢学习就会体会到这门语言的特征。Python的设计思想完全体现在了数据模型上,数据模型是一堆一堆的为Python提供特色而发明的小组件。

不管在哪种框架下写程序,都会花费大量时间去实现那些会被框架本身调用的方法, Python 也不例外。Python 解释器碰到特殊的句法时,会使用特殊方法去激活一些基本的对象操作,这些特殊方法的名字以两个下划线开头,以两个下划线结尾(例如 __getitem__)。比如 obj[key]的背后就是 __getitem__ 方法,为了能求得 my_collection[key] 的值,解释器实际上会调用my_collection.__getitem__(key)。这些特殊方法名能让你自己的对象实现和支持以下的语言构架,并与之交互:

  • 迭代集合类
  •  属性访问
  • 运算符重载
  • 函数和方法的调用
  • 对象的创建和销毁
  • 字符串表示形式和格式化
  • 管理上下文(即 with 块)

上面这段是从该书上复制的,我的理解就是通过给我们自己的类添加实现__xxx__()这样的方法,就能与Python语言自身的大多数特性与之交互,这样我们自己的类看着就跟Python自身自带的类就没什么两样了。__xxx__()类似这样的方法在Python中称为特殊方法,我们用不到直接调用它们,比如在一个类中如果实现了__len__()这个方法,我们就可以直接使用len(类名)这样间接的调用__len__(),这就是Python的特殊所在。

一个纸牌程序

import collections
from random import choice

# 创建一个纸牌类,有两个属性1:rank,2: suit
Card = collections.namedtuple('Card', ['rank', 'suit'])


class FrenchDeck(object):
    """

    """
    ranks = [str(n) for n in range(2, 11)] + list('JQKA')
    suits = 'spades diamonds clubs hearts'.split()

    def __init__(self):
        self._cards = [Card(rank, suit) for suit in self.suits
                       for rank in self.ranks]

    def __len__(self):
        return len(self._cards)

    def __getitem__(self, position):
        return self._cards[position]

    def getRandomCard(self):
        return choice(self._cards)

    def get4Card(self):
        card1 = list()
        for i in range(13):
            card1.append(self.getRandomCard())
            self._cards.pop(self._cards.index(card1[-1]))
        return card1

这个程序是从该书上复制的,getRandomCard()和get4Card()两个函数是我自己加的,前者是从随机抽取一张牌,用到了random模块中的choice方法,后者是抽取13张牌并且从原有牌中删除掉抽取出来的牌,相当于发13张牌,调用四次刚好把牌发完。该程序的核心是__len__()、__getitem__()这两个方法。

代码解释:

  1. 导入collections模块和random模块里边的choice方法
  2. 用collections模块里边的namedtuple()创建一个带名字的元组类Card,该类有两个属性’rank’和’suit’,用该模块创建的类只有属性。
  3. 创建类一个FrenchDeck类,该类是Python中的普通类
  4. 创建类中所需要的属性和方法
    1. 创建ranks列表,用了python中的列表生成表达式, range(2, 11)是生成纸牌的数字2~10, list(‘JQKA‘)是纸牌的非数字那几张
    2. suits是纸牌的花色,用到了字符串的split()方法,此方法将会分割字符串中有空格间隔的字符
    3. 在__init__()方法中再次用到Python中的列表生成表达式生成整副牌,列表生成式中用到了Card元组类,注意着里成员变量的前面有单下划线说明是私有的,尽量只在类内使用

开始学习–流畅的python

挑选了好久终于发现了《流畅的Python》这本书,大概看前两张,很不错。和其他的Python书记有很大的不同,这本书讲的知识点比较深而且都是Python语言特有的特性,把Python的特性讲的很到位的感觉。作为新手准备开始学习这本书了,作为学习记录我回把学习中的知识点记在我的博客上来。

本书一共六个部分二十一章,内容挺庞大的,想办法怎么把这本书的精华给吸收了!!!

第一章 数据模型

第二章 序列构成的数组

第三章 字典和集合

第四章 文本和字节序列

第五章 一等函数

第六章 使用一等函数实现设计模式

第七章 函数装饰器和闭包

第八章 对象引用、可变性和垃圾回收

第九章 符合Python风格的对象

第十章 序列的修改、散列和切片

第十一章 接口: 从协议到抽象基类

第十二章 继承的优缺点

第十三章 正确重载运算符

第十四章 可迭代的对象、迭代器和生成器

第十五章 上下文管理器和else块

第十六章 协程

第十七章 使用期物处理并发

第十八章 使用asvncio包处理并发

第十九章 动态属性和特性

第二十章 属性描述符

第二十一章 类元编程

 

Python 常用模块之 copy 对象复制

copy 是python 内置的对象复制模块,该模块提供了两个函数copy()和deepcopy(),前者是浅复制,后者为深复制。

copy() 浅复制

浅复制的对象只能对顶层对象有效,对象内部的其他对象都无效

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class Rectangle:
    def __init__(self, width, height, corner):
        self.width = width
        self.height = height
        self.corner = corner

p = Point(0, 0)
box = Rectangle(100, 50, p)

# 我们创建了两个类,一个Point点,一个Rectangle矩形
# Rectangle有三个属性,宽,高,和一个角点
# 我们用copy浅复制一个box对象
box1 = copy.copy(box)
# 这个时候box1的宽和高和box的是完全不相干的,你修改box1的宽和高不会影响box的
# 但是你修改box1.corner.x,box.corner.x也会受影响,应为它们本身就是一个这就是浅复制

# 这是深复制
box2 = copy.deepcopy(box)
# 这时你在修改box2的所有属性都不会影响其他的,深复制可以复制所有层次

本文到此结束,谢谢阅读!峰影

今天玩了一下python turtle 模块海归图形

昨天看到一篇关于python turtle 模块的教程,感觉挺有意思的,turtle意思是甲鱼、海龟,这是一个简单的图形库,使用这个库可以用代码画画。

今天简单参考使用帮助写了一个画菱形组合图的代码,效果如下:

turtle 官网文档:https://docs.python.org/3/library/turtle.html

代码:

'''
用python turtle模块画一个菱形组合图
url: https://www.z10.xin
about: 峰影
'''
import turtle
import math

bob = turtle.Turtle()
bob.speed(10) # 画图速度


def rhombus(t, color, ang, length):
    '''
    该函数用来画一个菱形
    ang参数代表画完一个菱形后转义的角度
    '''
    t.color(color, color) # 设置钢笔和填充颜色
    t.begin_fill() # 开始填充
    t.forward(length) # 正向移动
    t.right(45) # 向右转45°
    t.forward(length)
    t.right(135)
    t.forward(length)
    t.right(45)
    t.forward(length)
    t.right(ang) # 画完一个菱形后偏移一个角度
    t.end_fill() # 结束填充

for i in range(9):
    for p in range(5):
        if p == 1:
            rhombus(bob, 'red', 150, 180)

        if p == 2:
            rhombus(bob, 'blue', 150, 200)

        if p == 3:
            rhombus(bob, 'green', 150, 220)

        if p == 4:
            rhombus(bob, 'yellow', 150, 240)

turtle.mainloop()

可以通过改变函数 rhombus(t, color, ang, length)的参数来修改绘制的图形,有兴趣的可以复制运行下试试感觉!

另外分享一个不错的Python新手教程:http://www.codingpy.com/books/thinkpython2/index.html

视频演示

本文结束,谢谢阅读!

Pyenv 使用笔记

Pyenv 的GitHub地址: https://github.com/FY2008/pyenv,官方GitHub有安装教程。

这里是Pyenv的命令手册:https://github.com/FY2008/pyenv/blob/master/COMMANDS.md

pyenv local 命令

# 该命令是用来设置当前目录使用的Python版本的,退出当前目录将变成全局中的版本
pyenv local 2.7.6
# 该命令是解除当前目录设定的局部版本的,将会回到全局版本
pyenv local --unset

# 还可以给一个目录同时指定多个局部版本
pyenv local 2.7.6 3.3.3

pyenv install

# 该命令是用来安装指定版本的Python的
$pyenv install 2.7.6

# 查看当前环境所安装的所有Python版本
$pyenv install versions

# 查看可以安装的Python版本
$pyenv install --list

pyenv uninstall

# 卸载指定版本的Python, 可选参数-f
# pyenv uninstall [-f|--force] <version>
$pyenv uninstall 2.7.6

查看当前版本

# 查看当前版本,并且显示它的位置
$ pyenv version
2.7.6 (set by /home/yyuu/.pyenv/version)

pyenv which

# 显示指定版本的绝对路径
$ pyenv which python3.3
/home/yyuu/.pyenv/versions/3.3.3/bin/python3.3

离线安装Python

使用pyenv install安装时常常会出错这是我们可以使用离线安装,方法是先将你需要的Python版本下载下来,我们可以先使用如:pyenv install 2.7.6 命令安装一下,这是你会看到下载地址,你通过wget 下载下来,然后在pyenv 的目录下边新建一个cache文件夹,版下载的文件放到这个文件夹下重新执行安装命令即可安装。

解决Ubuntu 下安装python遇到的依赖包

  1. zlib1g-dev
  2. libreadline-dev
  3. libssl-dev
  4. libbz2-dev
  5. libsqlite3-dev

配合pyenv-virtualenv

安装pyenv-virtualenv的方法看这里:https://github.com/pyenv/pyenv-virtualenv ,下面说说使用方法。

安装一个独立的环境

这条命令创建了一个名为venv3.5.3的独立环境
pyenv virtuanenv 3.5.3 venv3.5.3

# 如果你安装官方的办法安装完成的话直接执行下面命令即可进入这个独立的环境venv3.5.3
pyenv local venv3.5.3

# 退出这个独立的环境
pyenv local --unset


# 以后就不用使用下边两条命令了, 插件已经为我们配置好了,你可以退出当前目录再查看下当前的python版本是否变化了
pyenv activate <name>
pyenv deactivate

# 卸载
pyenv uninstall my-virtual-env

 

到此结束,谢谢!

用Qt Designer设计一个PyQt5的Hello World界面程序

咱们今天用Qt Designer设计一个简单的Hello World界面,然后转换成py文件来运行。

先说说PyQt5的安装吧,安装我用的工具是pip。智能安装,但是安装前要把pip源改成国内的如豆瓣的。我的系统是Win10的,我就吧我的配置贴出来。

在管理器地址栏输入%appdata%,然后回车会调到C:\Users\“你的用户名”\AppData\Roaming,在这个目录下新建一个pip文件夹,再在pip文件夹下建立一个pip.ini文件。最后把下面代码复制进去就行了

[global]
timeout = 6000
index-url = http://pypi.douban.com/simple
trusted-host = pypi.douban.com

安装PyQt5 和 Qt Designer

pip install PyQt5

pip install PyQt5-tools

安装完后Qt Designer就可以在Python的C:\Program Files\Python35\Lib\site-packages\pyqt5-tools下边找到了。

制作界面

保存界面文件为helloworld.ui。然后用命令 : pyuic5 -x helloworld.ui -o helloworld.py 生产py文件。

## 上边命令生产的py文件中的代码

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'helloworld.ui'
#
# Created by: PyQt5 UI code generator 5.8.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.setEnabled(True)
        Dialog.resize(400, 300)
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(110, 90, 181, 111))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setObjectName("label")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "中心线 - http://www.z10.xin"))
        self.label.setText(_translate("Dialog", "Hello World"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

运行结果

本文就到这里了,再见!

Python 常用数据结构操作方法

这篇文章介绍的是Python中最常用的数据结构的操作方法和注意事项,本人也是新手所以难免有错,在这里主要用来做个记录以备往后查询只用。

Python 中的常用数据结构列表

  1. 数字
    1. 整数 (int)
    2. 浮点数 (float)
  2. 字符串 (str)
  3. 布尔值 (True/False)
  4. 空值 (None)
  5. 列表 (list)
  6. 元组 (tuple)
  7. 字典 (dict)
  8. 集合 (set)

以上是Python中常用的数据结构,下边我们进行一一的讲解它们的操作方法。

1.1 整数的操作方法

#整数可以进行的运算有(+,-,*,/,//,%)
>>>num = 4
>>>num + 3 #加
7
>>>num - 10 #减
-6
>>>num * 10 #乘
40
>>>num / 10 #除
0.4
>>>num // 3 #“//"除法只保留整数部分
1
>>>num % 3 #求余
1
>>>str(num) #整数转字符串,用到了Python内置的str()函数
'4'
>>>int('34') #将字符串转换成整数,用到了Python内置的int()函数
34
>>>0x4a #十六进制表示一个整数
74

1.2 浮点数的操作方法

#Python 浮点运算
>>>f = 5.76
>>>f + 3.4
9.16
>>>f - 2.03
3.73
>>>f * 2.11
12.153599999999999
>>>f / 2
2.88
>>>str(f)
'5.76'
>>>float('2.3')
2.3
>>>0.32e5 #科学记数法写法
32000.0

2. 字符串的操作

字符串是每种编程语言中必有的一种数据类型,因为字符串太常用了。比如你用搜索引擎时输入的就是”字符串”,对字符串进行处理是经常要做的事,下边开始字符串使用之旅吧。

#Python 字符串操作
c1 = 'a'
c2 = 'hello world'
c3 = "I'm OK" #如果字符串中包括‘'’单引号我们可以使用‘"’双引号创建字符串
c4 = 'I\'m \"OK\"' #如果字符串中同时存在单引号和双引号,我们可以使用\进行转义
c5 = r'I\nm "OK"' #以r开头的字符串代表不进行转义,程序将会按原样打印字符串
c6 = '''hello world,I'm "OK",ok''' #我们还可以使用3个引号来创建多行字符串
>>>c1 * 2
'aa'
>>>c1+c2
'ahello world'
>>>c2[4] #获取字符串第四个元素
'o'
>>>c2[2:6]#获取字符串从第二个元素到第六个元素,但不包含第六个
'llo '
>>>c2[:6] + 'https://www.z10.xin' #获取字符串前5个字符串,并加上一个新的字符串
'hello https://www.z10.xin'
>>>c2[:] #获取整个字符串
'hello world'
>>>c2[-6:-2] #获取这个区间的字符,不包含-2位置的字符
' wor'
>>>'e' in c2 #in 成员运算符,判断'e'是否在字符串c2中
True
>>>'e' not in c2 #not in 判断成员不在c2中
False


3. 布尔值(bool)

布尔值一般用作判断,布尔值有两个,一个是True为真,一个是False为假。

如:type(1==0)将返回False。

4. 空值(None)

空值是Python中特有的一种类型,带表什么都没有。并不是0的意思。

5. 列表(list)

列表是Python内置的一种有序集合,可以随时添加和删除元素。

#创建一个空列表
list_1 = []

#向列表尾部添加元素
list_1.append('a')

#查看一个元素在列表中出现的次数
list_1.count('a')

a = [1,2,3]

#向列表扩展一个列表
list_1.extend(a)

b = ['c']
#向列表指定位置插入元素
list_1.insert(2, b)

#删除列表尾部的一个元素
list_1.pop()

#删除列表指定位置的一个元素
list_1.pop(3)

#删除列表中第一个匹配的元素
list_1.remove('a')


#反转列表中的元素
list_1.reverse()

#排序
list_1.sort(func)

6. 元组(tuple)

元组与列表非常相似,最主要的区别是元组不能修改。

#Python 元组操作
#元组只有一个元素时要在元素后面加上逗号
t = ('a',)

#元组有两个成员函数count()和index()

7. 字典(dict)

字典是一种键值对数据类型,是一个无序数据结构。访问方法是通过键来访问的。

#Python 字典操作
#创建一个字典
dict_1 = {'name': '小李', 'age': 18}

#访问字典名字
dict_1['name']
#访问字典年龄
dict_1['age']

#字典内置方法
#清空字典所有内容
dict_1.clear()

#复制一个字典
dict_1 = dict_1.copy()

>>>keys = ('name', 'age', 'sex')
>>>dict_2 = dict.fromkeys(keys, 0) #fromkeys()函数的作用是用一个序列作为字典的键来创建一个字典,字典的值默认是None,我们也可以指定可选参数的值来改变默认值

{'name': 0, 'age': 0, 'sex': 0}

dict.get(key, default=None) #返回指定键的值,如果值不在字典中返回default的值
dict.has_key(key)#判断键是否在字典里边,返回布尔值
dict.items()#以列表返回可遍历的(键,值)元组
dict.keys()#以列表返回字典所有的键
dict.setdefault(key, default=None) #和get()类似,如果键不在字典中,将会添加键并设置为default
dict.update(dict2) #把字典dict2中的键值对更新到dict中
dict.values() #以列表返回字典中的所有值