Updated at 2020-12-01 09:00

最终,Deolin选择了Python作为他的第二编程语言

  • 由于是完全自学,也没有任何项目包袱,所以Deolin选择了最新的3.7.3版本来入门
  • 为了方便自己理解,Deolin会拿Python与Java做一些适当的类比

2020-12-01追记:学习Python系列被整合在了一起

常用类型

流程控制

函数

定义、使用

没有大括号,只有冒号

def do_something(what_thing):
    print(what_thing + ' done.')

do_something('writing')

关键字参数

def someone_do_something(who, what_thing):
    print(what_thing + ' done by ' + who + ".")

someone_do_something(who = 'Deolin', what_thing = 'writing')

参数默认值

def do_you_like_deolin(y_n=True):   # 等号两端不要有空格
    if y_n:
        print('yes, i do')
    else:
        print('no, i do not')


do_you_like_deolin()

函数修改列表

def modify(list, str):
    list[0] = str

raw = list(range(0,10))

modify(raw, 'first')
print(raw)

modify(raw[:], 'second')         # 注意[:]
print(raw)

不定参数列表

def mmm(*args):
    for v in vs:
        print(v)
mmm(1,2,3,4,'a')

在这里,values是个元组

不定关键字参数列表

def iii(**kwargs):
    for k, v in kvs.items():
        print(k + '---' + str(v) + '\n')

iii(w='1', a='b', b=1) # 这里的key不能是数字,也不能以数字开头

什么是模块

定义了若干函数的的py文件,被称为模块

导入整个模块

import pizza as p

p.greeting()
p.serve()
p.clean()

import后跟的是py文件名

导入模块里的某个函数

from pizzz import greeting, clean

greeting()
clean()

类(Class)

文件IO

异常

命名规约

驼峰还是蛇形?

在Python的官方的示例代码中,出现过3种命名法

  • SCREAMING_SNAKE_CASE:常量
  • PascalCase:类名
  • snake_case:变量名、函数名、属性名、方法名、包名、模块名、py文件的文件名

与官方保持一致即可。

下划线的作用

  1. 单前导下划线 (如_var

    代表这个属性或方法是受保护的,能够访问但不建议访问。

    “不去管它就好”

  2. 单末尾下划线 (如def_

    用于解决变量名被Python关键字占用的情况

  3. 双前导下划线 (如 __var

    代表不能访问,dir()中找不到它,因为它被Python修饰成别的方法名了

  4. 双前导和末尾下划线 (如__var__

    代表内置属性,可以访问,但绝对不要创造这样命名的属性或方法

  5. 单下划线

    用来为不需要被引用变量来占位,常见用法有以下两种

    for _ in range(5): # 作用类似Java中的for-index循环
        print('hh')
    user_profile = (1, 'Deolin', 'Hangzhou', 'male', ['Java', 'Python'])
    _, name, _, _, langs = user_profile
    print(name)
    print(langs)

MySQL、Redis

MySQL

# coding=utf-8

import pymysql


# 建立MySQL连接
connection = pymysql.connect(host='127.0.0.1',
                             port=3306,
                             database='beginning_mind',
                             user='root',
                             password='root_r0oT',
                             charset='utf8')

cur = connection.cursor(pymysql.cursors.DictCursor)

try:
    cur.execute('insert into biz_demo (id,name) values (%s, %s)', (2, 'a'))
    connection.commit()
except:
    db.rollback()

cur.execute('select * from biz_demo')
for one in cur.fetchAll():
    print(one)

db.close()

pymysql类似与Java中的apache-dbutils,业务复杂时应该还是要上ORM

Redis

# coding=utf-8

import redis

connection = redis.Redis(host='127.0.0.1',
                         password='root_r0oT',
                         decode_responses=True) # decode_responses=True用来确保取值时中文不乱码

connection.hset('a', 'b', '汉字')
print(connection.hget('a', 'b'))

redis是Redis官方提供的Python类库

JSON、CSV

#!/usr/bin/python3
import pandas as pd

demo_data = {'a': [1, 2, 3], 'b': [4, 5, '汉字']}

# help(pd)
df = pandas.DataFrame(demo_data)

# help(df)
print(df.to_json(force_ascii=False))
print(df.to_csv())

注意编码问题

中文乱码问题

def chinese(txt):
    if type(txt) is bytes:
        txt = txt.decode('unicode_escape')
    if type(txt) is str:
        txt = txt.encode('latin-1').decode('unicode_escape')
    return txt

遇到类似于\u5267\u60c5的情况,有效

时间

time

  1. time.time() 读取1970-01-01 00:00:00至当前系统时间的秒数,返回值是个浮点数,即包含了毫秒数、尾秒数等信息
    • 存在2038限制
  2. time.sleep() 可以理解为Java中的Thread.sleep()

datetime.datetime

  1. datetime是库名,库内有一个class也叫datetime,即datetime数据类型,代表日期时间
  2. 构造datetime
    • dt = datetime.datetime.now()
    • dt = datetime.datetime(2012, 12, 31, 0, 0, 0)
      • 可以看一眼构造方法,datetime精确到微秒,还支持时区信息
    • dt = datetime.datetime.fromtimestamp(time.time())
  3. 解析datetime
    • Year = dt.year
    • day = dt.day
    • …etc
  4. datatime支持<>==!=的比较

datetime.timedelta

  1. datetime库中还有一个class是timedelta,代表时间的变化量

  2. datetime.timedelta.total_seconds() 返回变化量折合的秒数

  3. timedelta可以直接与datetime相加,两个datetime相减直接返回timedelta类型。Python的类型转换真是太灵活了

格式化

  1. dt.strftime(‘%Y-%m-%d %H:%M:%S’)

  2. string -> datetime的函数是strftime


Python      Python