简书样式测试

Python基本语法&结构

函数

定义

def function_name(parameter = "default_value"):

pass // 使用pass定义空函数

return a, b, c //返回多个参数时, 多个参数放在同一个元组(tuple)中

参数
位置参数
  • 参数传入时, 实参与形参位置一一对应
默认参数
  • 设置默认参数大坑: 默认参数必须为不变对象

//借助None、string等不变对象为可变对象设置默认值

def add_end(L=None):

    if L is None:

        L = []

    L.append('END')

    return L

可变参数

// 传入一串参数, 函数接收时以tuple形式存储

def calc(*numbers):

        sum = 0

    for n in numbers:

        sum = sum + n * n

    return sum

-----------snip-------------

>>> calc(1, 2)

5

>>> calc()

0

  • 若已经存在listtuple, 可在前添加*作为参数传入函数
map
  • map(fuction_name, iterable)

  • 将接收的函数依次作用于每个元素, 返回一个iterator


def standardize_name(name):

    return name.lower().capitalize()

# 使用map

r = map(standardize_name, ['adam', 'LISA', 'barT'])

# map 返回一个 iterator, 可使用next(r)访问元素

print(list(r))

reduce
  • reduce(function_of_two_vars, iterable)

  • 函数必须为二元函数

  • 传两个参数, 通过函数计算出结果, 将该结果作为下次传入函数的参数之一, 累积运算


from functools import reduce

def add(x, y):

return x + y

----------------snip-------------------

reduce(add, [1, 3, 5, 7, 9])

snip------------------

25 //输出结果

filter
  • filter(function_name, iterable)

  • 作用于传入的每个函数, 根据返回值的真假, 决定元素的去留, 并返回一个iterator

sorted
  • 运用sorted+ lambda实现简洁排序

sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)// key可传入lambda 形式函数

['Zoo', 'Credit', 'bob', 'about']

补充-匿名函数lambda
  • 传入参数 : 执行表达式

lambda x, y: x*y

# 函数输入x, y 输出两者积

返回函数

闭包 closure

Python闭包详解

Python小记

  • 闭包函数必须返回一个函数对象,

  • 返回的函数必须引用外部变量(非全局变量), 返回函数可以无return


def line_conf(a, b):

def line(x):

        return a * x + b # 引用外部变量a,b

    return line # 返回函数line

---------------snip------------------

 #定义两条直线

line_A = line_conf(2, 1) #y=2x+b

line_B = line_conf(3, 2) #y=3x+2



#打印x对应y的值

print(line_A(1)) #3

print(line_B(1)) #5

  • 命名闭包: 每次对闭包外函数的调用, 都会创建新的闭包, 使用不同的变量名来区分闭包

f1, f2, f3 = ExFunc() # 命名闭包

f1() # 执行闭包

  • 闭包中引用循环变量: 将循环变量绑定至默参数

def fo():

    fs = []

    for i in range(3):

        def foo(x, y=i): # 循环变量设置为y的默认值

            return x+y

        fs.append(foo)

    return fs

f1, f2, f3 = fo()

print(f1(1), f2(1), f3(1))

闭包优点&实际应用
  • 销毁机制: 普通函数无法保存运行环境

  • 闭包保存运行环境: 通过调用外部变量, 保存运行环境, 具体机制不明

待补充

装饰器 decorator

Python小记

刘志军-装饰器讲解

  • 函数也是Python中的对象

  • 装饰器为已经存在的对象添加额外功能


def decorator_name(fuc):

    def wrapper(*args, **kwargs): # 用于接收被装饰函数参数

        statement

        return fuc(*args, **kwargs)

    return warpper

@decorator_name # 表明接下来的函数使用装饰器

def fuc(vara, varb):

    statement



fuc()

  • 带参数的装饰器

import logging

def use_logging(level):

    def decorator(func):

        def wrapper(*args):

            print(level)  # 引用外部变量 level(非全局)

            logging.warning("%s is running" % func.__name__)  # 引用全局变量func

            return func(*args)  # 返回被修饰函数结果

        return wrapper

    return decorator

@use_logging('nice')  # 相当于 BAR = use_logging('nice')\n BAR(bar(1, 2))

def bar(x, y):

    print('i am bar', x, y)

bar(1, 2)

-----------------snip---------------------

# 结果

nice

WARNING:root:bar is running

i am bar 1 2

-----------------snip---------------------

疑问: 根据之前了解到的闭包定义, 此处返回的函数对象 decorator 应当引用外部变量, 但是此处是 其内部的wrapper 引用了外部变量

装饰器优点&实际应用

待补充

装饰器内容补充

流畅的python-第七章 函数装饰器和闭包

模块

基本定义
  • 模块 module: 将函数进行分类, 放入至多个.py文件中, 一个.py文件称之为模块

  • **包 **package: 为避免模块命名冲突, python引用目录来组织模块

    • __init__.py: package下必须添加该文件, 否则Python会将其识别为普通界面

待补充

其他

偏函数
  • 固定一个函数的常用参数,

import functools

int2 = functools.partial(int, base=2)  # 固定int()函数的进制参数为 2

int2('1000000')

64 # 结果


# 非偏函数实现

def int2(x, base=2):

    return int(x, base)

面向对象编程

菜鸟教程-Python面向对象 -待补充http://www.runoob.com/python/python-object.html

面向对象编程

[图片上传失败...(image-b5f148-1570431464292)]

  • 类 class: 自定义对象

  • 方法 method: 调用对象关联的函数

  • 实例 instance: 传入参数后的对象


class Student(object):

    def __init__(self, name, score):

        self.name = name

        self.score = score

    def print_score(self):

        print('%s: %s' % (self.name, self.score))

私有变量: 限制访问内部属性
  • 私有变量: 通过添加__至变量前, Python将__name识别为_Student__name, 即添加了一道转化过程[^ 1], 防止name变量被直接修改

class Student(object):

    def __init__(self, name, score):

        self.__name = name  # 添加"__"设置为私有变量

        self.__score = score

特殊变量

待补充

获取&修改私有变量

待补充

继承: 获取其他类的全部属性
  • 方法重写: 在子类中重新定义父类方法, 子类方法将会覆盖父类方法

  • 多态: 定义Class, 相当于定义了一种数据类型, 继承父类方法后, 该子类则具备了两种数据类型的属性


Class SubClassName (ClassName):

def __init__(self, var1, var2, var3):

        '''初始化父类属性'''

        super().__init__(var1, var2, var3)

待补充

获取对象信息
  • type()判断对象类型

>>> type(123)

<class 'int'>

  • types()判断对象是否是函数

>>> import types

>>> def fn():

...    pass

...

>>> type(fn)==types.FunctionType

True

  • isinstance(对象名, 类名)判断属于何种class类型

>>> a = Animal()

>>> d = Dog()

>>> h = Husky()

>>> isinstance(h, Husky)

True

  • dir()获取对象的所有属性和方法

>>> dir('ABC')

['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

# 返回一个字符串, 包含所有属性和方法

实例属性&类属性
  • 创建实例&类属性

# 通过定义同名类属性和实例属性, 来比较两种属性的优先级, 实例优先于类属性

class Student(object):

    name = 'Student'  # 创建类属性

    def __init__(self, name):

        self.name = name  # 创建实例属性

print(Student.name)

Student = Student('Mike')

Student.name = 'Killy'  # 绑定新属性

print(Student.name)

# 打印结果

Student

Killy

限制实例的属性

面向对象高级编程

多重继承
  • 一个子类获取多个父类的方法和属性
Mixin

Python中的Mixin类 : Python多继承的魔力

待补充

定制类

待补充, 定义特殊方法, 使类能够进行 遍历 切片

枚举类

待补充

使用元类

待补充(基本用不到)

处理错误

单个程序是否出错
检测修改后程序功能是否完整
文档测试

待补充

IO编程
基本定义
  • IO : input 发送数据, output 接收数据

  • 异步IO性能高于同步IO

储存数据

将代码生成或者处理完成的数据转化为JSON进行储存

  • JSON形式写入数据&读取

#!/usr/bin/env python3

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

import json

d = dict(name='Bob', age=20, score=88)

data = json.dumps(d)

print('JSON Data is a str:', data)

reborn = json.loads(data)

print(reborn)

# 定义测试类

class Student(object):

    def __init__(self, name, age, score):

        self.name = name

        self.age = age

        self.score = score

    def __str__(self):

        return 'Student object (%s, %s, %s)' % (self.name, self.age, self.score)

s = Student('Bob', 20, 88)

std_data = json.dumps(s, default=lambda obj: obj.__dict__)

print('Dump Student:', std_data)

rebuild = json.loads(std_data, object_hook=lambda d: Student(d['name'], d['age'], d['score']))

print(rebuild)

-------------------sinp----------------------

JSON Data is a str: {"name": "Bob", "age": 20, "score": 88}

{'name': 'Bob', 'age': 20, 'score': 88}

Dump Student: {"name": "Bob", "age": 20, "score": 88}

Student object (Bob, 20, 88)

进程和线程

搞定python多进程和多线程

深入理解python中的ThreadLocal变量(上) 待补充

基本概念
  • 进程 process : 主任务

  • 线程 thread : 主任务下的子任务

  • 多任务: 操作系统通过极速交替执行多个任务, 使得任务看起来像同时进行


情境举例

打开word: 启动word进程, 主任务

在word中打字(子任务1), 排版(子任务2)

  • 多任务实现的三种模式

    • 多进程模式

    • 多线程模式

    • 多进程+多线程模式

  • 多进程和多线程区别

    • 多进程 : 同一变量, 每个进程中都有一份该进程的拷贝, 修改互不影响

    • 多线程 : 所有线程共享同一个变量, 需要使用Lock防止变量被改乱

在windows上编写多进程程序
  • multiprocessing模块提供Process

from multiprocessing import Process

import os

# 子进程要执行的代码

def run_proc(name):

    print('Run child process %s (%s)...' % (name, os.getpid()))

# os.getpid()获取父进程ID

if __name__=='__main__':

    print('Parent process %s.' % os.getpid())

    '''创建Process实例, 传入执行函数, 函数参数, 使用 star()启动, join() 用于等待进程结束后继续运行'''

    p = Process(target=run_proc, args=('test',))

    print('Child process will start.')

    p.start()

    p.join()

    print('Child process end.')

待补充

多线程
  • _threadthreading(常用)提供Thread

import time, threading

# 传入Thread中的函数

def loop():

    print('thread %s is running...' % threading.current_thread().name)

    n = 0

    while n < 5:

        n = n + 1

        print('thread %s >>> %s' % (threading.current_thread().name, n))

        time.sleep(1)

    print('thread %s ended.' % threading.current_thread().name)

print('thread %s is running...' % threading.current_thread().name)

'''创建Thread实例, 传入执行函数, 设置线程名字为LoopThread'''

t = threading.Thread(target=loop, name='LoopThread')

t.start()

t.join()

print('thread %s ended.' % threading.current_thread().name)

Lock
  • 无论有多少线程, 同一时刻只有一个进程拥有锁, 避免了修改造成的冲突

  • threading.lock()创建锁


balance = 0

# 创建锁

lock = threading.Lock()

def change_it(n):

    global balance

    balance = balance + n

    balance = balance - n



def run_thread(n):

    for i in range(100000):

        # 获取锁

        lock.acquire()

        try:

            change_it(n)

        finally:

        # 释放锁,否则其他进程无法执行change_it()

            lock.release()

TreadLocal

解决python中各线程之间局部变量的传递问题

待补充

分布式进程

将多进程分布至多台机器上使用

待补充

常用内建模块

datetime
  • 获取时间, 在datetime 和 timetamp间相互转换

  • 时区转换, 待补充

collections
namedtuple

'''创建一个自定义元素个数的tuple, 并可以通过属性来访问'''

from collections import namedtuple

Point = namedtuple('test', ['x', 'y'])

p = Point(1, 2)

print(p.x)

deque

添加了popleft以及appendleft

defaultdict

python中 defaultdict用法详解

https://www.jianshu.com/p/bbd258f99fd3

python中 defaultdict与lambda表达式配合使用


from collections import defaultdict

dict1 = defaultdict(int) # 默认输出0

dict2 = defaultdict(set) # 默认输出set()

dict3 = defaultdict(str) # 默认输出空字符串

dict4 = defaultdict(list) # 默认输出[]

dict5 = defaultdict(lambda: 'N/A')

dict1[2] ='two'

print(dict1[1])

print(dict2[1])

print(dict3[1])

print(dict4[1])

print(dict5[1])

-------------------snip--------------------

输出结果

0

set()

[]

N/A

OrderedDict

'''间key按照插入顺序进行排序,可以创建一个先进先出,限制容量的dict'''

from collections import OrderedDict

class LastUpdatedOrderedDict(OrderedDict):

    def __init__(self, capacity):

        super(LastUpdatedOrderedDict, self).__init__()

        self._capacity = capacity

    def __setitem__(self, key, value):

        containsKey = 1 if key in self else 0

        if len(self) - containsKey >= self._capacity:

            last = self.popitem(last=False)

            print('remove:', last)

        if containsKey:

            del self[key]

            print('set:', (key, value))

        else:

            print('add:', (key, value))

        OrderedDict.__setitem__(self, key, value)

待补充

ChainMap

不懂, 待补充

Counter

Python标准库——collections模块的Counter类


'''dict的子类, 用于统计字符的出现次数'''

from collection import Counter

print(Counter('programing'))

-------------------snip----------------------

输出结果

Counter({'r': 2, 'g': 2, 'p': 1, 'o': 1, 'a': 1, 'm': 1, 'i': 1, 'n': 1})

contextlib

python魔法版块之contextlib(附应用实例)

Python学习笔记-with语句与上下文管理器-MR怪蜀黎

  • 操作文件时使用with上下文管理器

'''通过with....as语句, python将打开的文件属性绑定至file_obj上,借此进行操作; windows文件路径中使用需使用双斜杠'''

with open('C:\\Users\\HenryHe', 'r') as file_obj:

print(file_obj.read())

  • with下缩进代码执行完毕后, 自动关闭文件的原理

class OpenContext(object):

    def __init__(self, filename, mode):

        '''将打开的文件绑定至fp'''

        self.fp = open(filename, mode)

    def __enter__(self):

        '''获取fp'''

        return self.fp

    def __exit__(self, exc_type, exc_val, exc_tb):

        '''文档操作结束后, 自动调用关闭'''

        self.fp.close()

with OpenContext('测试文档.txt', 'r') as file_obj:

    print(file_obj.read())

  • 使用@contextmanageryield

  • with先执行yield之前的语句, 执行with下的语句, 最后执行yield之后的语句


@contextmanager

def tag(name):

    print("<%s>" % name)

    yield

    print("</%s>" % name)

with tag("h1"):

    print("hello")

    print("world")

  • 使用closing将具有close()方法的任意对像, 变为上下文对象

from contextlib import closing

from urllib.request import urlopen

with closing(urlopen('https://www.python.org')) as page:

    for line in page:

        print(line)



--------------------snip--------------------

# closing 是一个经过@contextmanager装饰的generator

@contextmanager

def closing(thing):

    try:

        yield thing

    finally:

        thing.close()

  • threading.lock中使用with

# 使用with

import threading

with lock:

    my_list.append(item)



------------------snip---------------------

# 不使用with

import threading

lock = threading.Lock()

lock.acquire()

try:

    my_list.append(item)

finally:

    lock.release()

urllib

urllib提供了一系列用于操作URL的功能

待补充

XML

解析XML


from xml.parsers.expat import ParserCreate

#利用SAX解析XML文档牵涉到两个部分: 解析器和事件处理器

#解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件。

#而事件处理器则负责对事件作出响应,对传递的XML数据进行处理

class DefualtSaxHandler(object):

    def start_element(self,name,attrs):

        print('sax:start_elment: %s,attrs: %s'%(name,str(attrs)))

        #name表示节点名称,attrs表示节点属性(字典)

    def end_element(self,name):

        print('sax:end_element: %s'%name)

    def char_data(self,text):

        print('sax:char_data: %s'%text)

        #text表示节点数据

xml=r'''<?xml version="1.0"?>

<ol>

    <li><a href="/python">Python</a></li>

    <li><a href="/ruby">Ruby</a></li>

</ol>

'''

#处理器实例

handler=DefualtSaxHandler()

#解析器实例

parser=ParserCreate()

#下面3为解析器设置自定义的回调函数

#回调函数的概念,请搜索知乎,见1.9K赞的答案

parser.StartElementHandler=handler.start_element

parser.EndElementHandler=handler.end_element

parser.CharacterDataHandler=handler.char_data

#开始解析XML

parser.Parse(xml)

#然后就是等待expat解析,

#一旦expat解析器遇到xml的 元素开始,元素结束,元素值 事件时

#会回分别调用start_element, end_element, char_data函数

#关于XMLParser Objects的方法介绍下

#详见python文档:xml.parsers.expat

#xmlparser.StartElementHandler(name, attributes)

#遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典

#xmlparser.EndElementHandler(name)

#遇到XML结束标签时调用。

#xmlparser.CharacterDataHandler(data)

#调用时机:

#从行开始,遇到标签之前,存在字符,content 的值为这些字符串。

#从一个标签,遇到下一个标签之前, 存在字符,content 的值为这些字符串。

#从一个标签,遇到行结束符之前,存在字符,content 的值为这些字符串。

#标签可以是开始标签,也可以是结束标签。

#为了方便理解,我已经在下面还原来解析过程,

#标出何时调用,分别用S:表示开始;E:表示结束;D:表示data

如果看不明白,请配合脚本输出结果一起看

S<ol>C

C  S<li>S<a href="/python">CPython</a>E</li>EC

C  S<li>S<a href="/ruby">CRuby</a>E</li>EC

S</ol>E

待补充

HTMLParser

python爬虫系列-beautifulsoup

解析HMTL

待补充

第三方模块

pillow

python image library

图像操作

requests

获取URL资源

chardet

检测未知编码类型

psutil

系统监控, 获取系统信息

virtualenv

创建隔离的python运行环境

图形界面

待补充

网络编程

记录了纸质笔记

待补充

访问数据库

待补充

Web开发

本章需结合图解HTTP内容

WSGI接口

WSGI: Web Server Gateway Interface 服务器网关接口

  • 定义WSGI接口响应HTTP请求: 定义一个函数, 接收两个参数environ, start_response

  • environ: 一个dict, 包含HTTP请求报文所有信息

  • start_response: 发送HTTP响应报文的函数


# hello.py

# 定义一个WSGI接口

def application(environ, start_response):

    start_response('200 ok', [('Content-Type', 'text/html')])

    return [b'<h1>Hello, web!</n>']


# server.py

# 使用python内置模块创建测试服务器

# 命令行下运行server.py

from wsgiref.simple_server import make_server

from another_exp import application

httpd = make_server('', 8000, application)

print('正在端口8000运行HTML协议')

httpd.serve_forever()

Flask: 处理多个HTTP请求

# 处理三个URL 1.GET/: 首页, 返回Home.

# 2.GET/signin: 登录页, 显示登录表单

# 3.POST/signin: 处理登表单, 显示登录结果

from flask import Flask

from flask import request

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])

def home():

    return '<h1>Home</h1>'

@app.route('/signin', methods=['GET'])

def signin_form():

    return '''<form action="/signin" method="post">

              <p><input name="username"></p>

              <p><input name="password" type="password"></p>

              <p><button type="submit">Sign In</button></p>

              </form>'''

@app.route('/signin', methods=['POST'])

def signin():

    # 需要从request对象读取表单内容:

    if request.form['username']=='admin' and request.form['password']=='password':

        return '<h3>Hello, admin!</h3>'

    return '<h3>Bad username or password.</h3>'

if __name__ == '__main__':

    app.run()

使用模板: 将python代码与HTML代码隔离
flask模板

待补充

Django模板

待补充 主攻

异步IO

协程 Coroutine
  • yield接收调用方值, 将结返回给调用方, 并暂停协程

def averager():

    total = 0.0

    count = 0

    average = None

    while True:

        term = yield average  # send发送的数据传至yeild, term接收, 同时将函数尾, 即计算后yield的值返回给c.send()

        print('yield处的average', average)

        total += term

        count += 1

        average = total/count

        print('函数尾的average', average)

c = averager()  # 创建协程对象

next(c)  # 激活生成器, 也可以使用 c.send(None)

print('返回值', c.send(10)) 

print('返回值', c.send(30))

print('返回值', c.send(5))

-----------------snip---------------------

运行结果

yield处的average 0

函数尾的average 10.0

返回值 10.0

yield处的average 10.0

函数尾的average 20.0

返回值 20.0

yield处的average 20.0

函数尾的average 15.0

返回值 15.0

  • 启动协程的装饰器

from coroutil import coroutine

@coroutine

def coroutine_function():

    pass

Python对象

List

特点: 可变, 有序

  • 计算元素

    • 列表长度: len(list_name)

    • 特定元素: count(value)

  • 查询&获取元素

    • 返回第一个下标: index(element)

    • 下标获取

  • 添加元素

    • 指定位置: insert()

    • 列表末尾: append()

    • 整个列表至末尾: extend()

  • 移除元素

    • 特定元素: remove(index)

    • 特定元素: del(number)

    • 末尾元素并返回: pop()

    • 所有元素: clear()

  • 复制列表

    • 整个列表: copy()

    • 使用切片复制列表list_name[:]

  • 调整列表

    • 反转列表: reverse()

    • 排序列表: sort()

Tuple

特点: 有序, 不可变

  • count()

  • index()

Set

特点: 无序, 无重复元素, 无下标索引, 相当于一组无value、不重复的key

参考链接- https://www.w3schools.com/python/python_sets.asp

Dicthontary

特点: 无序, 可变, 有索引, 无重复键

  • 获取元素

    • 获取键值对:

      • for var in dic.items()获取(key, value)

      • for var1, var2 in dic.items()获取key value

    • 遍历键: keys()

    • 遍历值: values()

    • 获取值:

      • 键名访问

      • setdefault(key, default_value)键值存在返回值, 不存在创建新键值

  • 添加元素: dic[new_key] = new_value

  • 删除元素

    • 特定元素并返回该元素: pop()

    • 最后添加的元素并返回该元素: popitem()

    • 特定元素: del特定元素

附录A-关于Python的学习思路

主要参考资料

廖雪峰-Python3.X教程

Python从入门到实践

Python自动化编程上手

Python数据分析

时间: 19年2月8日22点07分

  • 考研期间一直使用OneNote记笔记, 当时知识点提炼概括的能力很弱, 总是一大版一大版的往上写, 现在看着都头疼, 现在开始用Typora记笔记, 主要格式为:

    • 笔记部分按教程或者章节目录划分, 写在正文

    • 启发、问题、延伸阅读资料收录入附录, 并附带:

      1. 问题的简要描述

      2. 问题产生的时间

      3. 问题是否解决

  • 今天刚开始尝试这种记录方法, 之前Python笔记未进行记录, 计划总结形式为:

    • 基本语法

    • 总结典型的Python程序

      • [图片上传失败...(image-2530dd-1570431464292)]
    • 对象

      • 初步以对对象的操作来分类方法
  • Python从入门到实践目前学习到了利用Python中的pygame模块, 制作简单射击游戏, 其中的指导意义大于应用意义, 主要是从游戏多模块搭建、导入、引用的过程中, 进一步理解程序功能模块化设计概念, 理解就ok

附录B-Python问题合辑

nonlocal 使用外层变量

def create_counter():

    x = 0

    print('外')

    def counter():

        nonlocal x  # 不使用时提示: UnboundLocalError: local variable 'x' referenced before assignment

        x += 1

        print('内')

        return x

    return counter

字符串操作方法.split无法处理多行字符串

# 传入主标题和多个副标题, 其中副标题以换行符进行分隔, 输出"主标题-副标题"至当前目录下txt文件

# 传入一次完成后提示重新传入

# 传输结束后, 将所有记录的内容粘贴至剪切板, 输出提示"粘贴成功"

import pyperclip

def joint_title(main_title, sub):

    sub.split('\n')

    for s in sub:

        with open(file_name, 'a') as obj_filen

            obj_file.write(main_title+'-'+s+'\n')

def output_info():

    with open(file_name) as obj_file:

        content = obj_file.read()

        pyperclip.copy(content)

    print('粘贴成功')

def wipe_file():

    with open(file_name, 'w') as obj_file:

        obj_file.write('')

        print('当前记录文档为空')

file_name = 'add_title_to_subtitle.txt'

while True:

    print('please enter your title: '+'\n'+'or enter a blank to exit'+'\n'+"or enter w to wipe the file")

    title = input()

    if title == ' ':

        output_info()

        break

    elif title == 'w':

        wipe_file()

        continue

    else:

        print('please enter your su btitle: ')

        subtitle = input()

        joint_title(title, subtitle)

        continue

状态: 未解决

if __name__ =='__main__'作用解析

浅析python中 if __name___ = ‘__mian__’的作用

https://www.cnblogs.com/alan-babyblog/p/5147770.html

python中__name__的使用

https://www.cnblogs.com/1204guo/p/7966461.html

  • 该语句常用于在文件中添加测试代码, 并且保证被其他文件引用时, 测试代码只会在当前文件下运行

  • __name__为python中内置的系统变量

  • python中具有导入模块操作, 可以用if __name__ =='__main__' 判断是否在当前模块

  • 一个.py文件相当于一个模块


# 创建文件 example.py 定义函数 test()

def test():

  print('we are in %s' % __name__)

if __name__ == '__main__':

    test()

    print('on running')

--------------------snip---------------------

运行结果

we are in __main__

on running

处于当前模块时 __name__的值为 __main__


# 同目录下创建文件 another_exp.py 文件

# 导入example.py 文件中的 test()函数

from example import test

test()

--------------------snip---------------------

运行结果

we are in example

未打印'on running', if 之后的语句没有运行

处于其他模块时 __name__的值为 原模块名字

状态: 解决

多线程改乱变量内容的原因

多线程-廖雪峰

namedtuple创建自定义tuple参数

第一个参数有什么用?


from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])

p = Point(1, 2)

print(p.x)

状态 : 未解决

defaultdict传入什么参数

'''传入一种数据类型或者函数, 可以传入lambda创建的简单函数'''

from collections import defaultdict

dict1 = defaultdict(int)

dict2 = defaultdict(set)

dict3 = defaultdict(str)

dict4 = defaultdict(list)

dict5 = defaultdict(lambda:'ok') # 无键时默认输出ok

函数生成器捕获错误获取返回值

stackoverflow

  • as将异常绑定至一个变量

def fib(number):

    n, a, b = 0, 0, 1

    while n < number:

        yield b 

        a, b = b, a + b

        n = n + 1

    return 'done'

'''由于next()运行机制, 使用for...in获取fib(6)中的元素时, 无法获取返回值, 通过捕获StopIteration来获取返回值'''

g = fib(6)

while True:

    try:

        x = next(g)

        print(x)

    except StopIteration as e:  # 捕获异常并绑定至e, 使用e.value引用返回值

        print('generator return value:', e.value)

        break

猜测: StopIteration是一个错误实, 其中的value方法储存了return的值

状态 : 未解决

from . import xxx是什么意思

相对路径导入

附录C-书本外Python编程合辑

利用mysqlflask设计简单网页

廖雪峰官方网站-python-web开发-使用模板

  • 三个版面 : 主页, 登陆页面, 登陆成功页面

  • 使用flask 中的render_template分离python代码和HTML

  • 利用mysql储存用户数据

时间: 19.2.27.18.22

附录D-精简Python代码

装饰器 @decorator_name()

@porperty

@contextmanager

[^ 1]: 不同版本的python转化后的形式不同, 一般不用这种方法访问

Python计算机二级大纲摘要

高教版python语言程序设计

考试题型

| 题型 | 题量 | 分值 |

| ------------------- | ---- | ---- |

| 公共基础知识-选择题 | 10 | 10 |

| Python科目题-选择题 | 30 | 30 |

| 基本编程题 | 3 | 15 |

| 简单应用题 | 2 | 25 |

| 综合应用题 | 1 | 20 |

考试环境

  • Python版本 : 3.5.3

  • 系统环境 : Windows 7

  • 开发环境 : python自带IDLE

考试范围

  • python初学者难度, 不涉及面向对象编程

  • python基本语法, python基本对象操作方法

  • 需要掌握的标准库: turtle (必选) random (必选) time(可选)

  • 需要掌握的第三方库: PyInstaller (必选) jieba(必选) wordcloud(可选)

网上题库

必考库-学习笔记

turtle

参考链接

python-turtle库详解 / 官方参考文档 / turtle库的使用(笔记---有图推荐)

基本概念
窗体绘制
  • 为绘图设置一块画布

  • 前两个参数设置画布的宽度和高度, 后两个参数可选, 用于设置窗口左上角坐标位置, 没有设置时, 窗口默认居中


turtle.setup(width, height, startx, starty)

空间坐标系
  • 笔头默认坐标(绝对坐标)位于画布中央, 坐标为(0, 0), 方向向右

  • 使用turtle.goto控制笔头移动到任意坐标, 画布会记录下移动轨迹

| 命令 | 说明 |

| -------------------- | -------------------------------------------------- |

| turtle.bk(distance ) | 向当前画笔方向移动distance像素长度 |

| turtle.fd(distance) | 向当前画笔相反方向移动distance像素长度 |

| turtle.circle(r) | 画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆 |

  • 简易示例

import turtle

while True:

    turtle.setup(width=800, height=500, startx=100, starty=100)

    turtle.goto(100, 100)

    turtle.goto(100, -100)

    turtle.goto(-100, -100)

    turtle.goto(-100, 100)

    turtle.goto(0, 0)

[图片上传失败...(image-b16b7e-1570431464292)]

角度坐标系
  • 仅改变画笔方向, 不进行移动

  • turtle.seth()传入参数为绝对角度, turtle.right()turtle.left()为相对角度

| 命令 | 说明 |

| -------------------- | ---------------------------- |

| turtle.right(degree) | 顺时针移动degree° |

| turtle.left(degree) | 逆时针移动degree° |

| turtle.seth(angle) | 改变画笔的角度, 画笔始终朝外 |

画笔运动及属性的更多设置

待补充

python-turtle库详解

例题

# 使用turtle.td()函数和turtle.seth函数绘制长方形

import turtle

d = 0

for i in range(4):

    turtle.fd(200)

    d += 90

    turtle.seth(d)

random

random常用用法

  • random.choice(list_name): 选取list中的随机元素

PyInstaller

jieba

Github-jieba-中文文档

基本概念
  • jieba用于拆分中文文档, 会对文字及符号进行拆分, 其中HMM参数不要求掌握

  • jieba.cut 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型

  • jieba.cut_for_search 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细

  • 待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8

  • jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用

  • jieba.lcut 以及 jieba.lcut_for_search 直接返回 list

  • jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。


import jieba

test = '今天的饭真好吃'

# 全模式, 返回一个生成器,使用for...in语句迭代元素

a_test = jieba.cut(test, cut_all=True)

'''

直接返回包含所有元素的列表, 若不指定cut_all参数, 则默认设置为精确模式, 即 cut_all=False

'''

b_test = jieba.lcut(test, cut_all=True)

# 精确模式

c_test = jieba.lcut(test, cut_all=False)

search_test = jieba.cut_for_search(test)

search_test2 = jieba.lcut_for_search(test)

print(b_test)

print(c_test)

print(search_test2)

print(", ".join(a_test))

--------------------snip-----------------------

输出结果

全模式直接返回列表的输出结果

['今天', '的', '饭', '真好', '好吃']

精确模式下输出结果

['今天', '的', '饭', '真', '好吃']

搜索模式下输出结果

['今天', '的', '饭', '真', '好吃']

全模式下输出结果, 出现了非词组'真好'

今天, 的, 饭, 真好, 好吃

例题

# 计算字符串s中的中文字符个数和中文词语个数, 中字符包含中文标点符号

# 计算字符串s中的中文字符个数和中文词语个数

import jieba

import re

s = "中国特色社会主义进入新时代,我国社会主要矛盾已经转化为人民日益增长的美好生活需要和不平衡不充分的发展之间的矛盾。"

n = len(s)

s = ''.join(re.findall(u'[\u4e00-\u9fff]+', s)) # 设置提取中文的正则表达式, 过滤标点符号

test_a = jieba.lcut(s, cut_all=False)

# print(test_a)

m = len(test_a)

print("中文字符数为{},中文词语数为{}。".format(n, m))

个人知识盲点补充

进制转换

# 其他进制转十进制 decimal

>>> int('待转换数', 待转换数进制)

# 十进制转其他进制

转十六进制 hexadecimal

>>> hex(dec)

转八进制 octonary

>>> oct(dec)

转二进制 binary

>>> bin(dec)

%与format用法

python基础-格式化输出

%用法
  • 输出整数

print('%o' %20)  # 输出八进制

print('%d' %20)  # 输出十进制

print('%x' %20)  # 输出十六进制

  • 输出浮点数

待补充

  • 输出字符串

待补充

format用法
  • 位置匹配

'''

format函数传入元素具有下标索引, 可以在花括号用数字指定使用特定索引的元素, 元素可以重复使用, 也可以使用关键字参数定位

'''

# 不带参数

print('{} {}').format('hello', 'world')

# 重复使用hello

print('{0} {0} {1}').format('hello', 'world')

# 使用关键字参数定位

print('{'f'} {'s'}').format('f'='hello', 's'='world')

  • 格式转换

'''

花括号中除了指定位置参数外, 还可以指定格式符

'''

# 输出十进制

print('{位置参数:b}').format(20)

# 输出八进制

print('{位置参数:o}').format(20)

# 输出十六进制

print('{位置参数:x}').format(20)

# 待补充

  • 填充
正则表达式

待补充

翻转列表

a = (1,2,3,4)

a[::-1]  # 结果为(4,3,2,1)

基础习题集


from collections import Counter

ls = ["综合", "理工", "综合", "综合", "综合", "综合", "综合", "综合", "综合", "综合",

      "师范", "理工", "综合", "理工", "综合", "综合", "综合", "综合", "综合", "理工",

      "理工", "理工", "理工", "师范", "综合", "农林", "理工", "综合", "理工", "理工",

      "理工", "综合", "理工", "综合", "综合", "理工", "农林", "民族", "军事"]

for x, y in Counter(ls).items():

    print(x+':'+str(y))

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 基于《Python语言程序设计基础(第2版)》 第一部分 初识Python语言 第1章 程序设计基本方法 1.1 ...
    柄志阅读 27,310评论 4 44
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,713评论 0 10
  • 1 this 关键字(重点) 对于this关键字来说在java中是使用比较频繁的一个关键字,this关键字在jav...
    BP丶阅读 430评论 0 0
  • 列表和元组 列表是可以修改的,元组不可以 通用的序列操作:索引、切片、相加、相乘、成员资格检查 索引:序列中的所有...
    神之影阅读 202评论 0 0
  • 1、行内元素有哪些?块级元素有哪些?他们的区别是什么? 行内元素主要有:a b br i span input s...
    翕之阅读 194评论 0 1