[原创]Python基础知识小结(1)

本文『很傻很天真』,熟悉Python的人都不用看了。另外本文的部分内容已经过时,请视情况忽略。
环境:未特别注明的话为Python 3.2.3,特别注明了的话则为注明的版本。

▶▶ Python访问MySQL
听说很多人都使用著名的MySQLdb来访问MySQL,但是它并不支持Python 3.x的版本。所以要另寻出路。那就是mysql-connector-python,它是MySQL官方提供的,并且它不依赖于MySQL C客户端library
文章来源:http://www.codelast.com/
下面给出一段查询MySQL记录的示例代码:

import mysql.connector
import sys

__author__ = 'codelast'

username = 'root'
password = 'xxx'
host = '127.0.0.1'
db = 'mydb'

connection = mysql.connector.connect(user=username, password=password, host=host, database=db)
cursor = connection.cursor()

sql = "SELECT * FROM my_table WHERE id = 9"
try:
    cursor.execute(sql)

    # 打印查询到的记录的行数
    data = cursor.fetchall()
    print(len(data))

    # 输出所有记录
    for (ID, name) in data:
        print("name:[%s]" % (name))

except mysql.connector.Error as err:
    print("Failed to query table, detail: {}".format(err.msg))
    sys.exit()

connection.commit()
cursor.close()
connection.close()

上面的代码很简单,无非就是从my_table表里查询一些记录,再打印出来。
注意 for (ID, name) 中的括号里要写全该表中,你查询的所有字段名,否则会报错。还有其他遍历查询结果的方法,后面会继续陈述。

▶▶ 逆序遍历list

myList = [123]
for item in reversed(myList):
    print(item)

输出:

3
2
1

注意是 reversed 不是 reverse。这只是逆序遍历,myList中的数据顺序并不会改变。
文章来源:http://www.codelast.com/
▶▶ 使用MySQLdb访问数据库时,“TypeError: execute() takes at most 3 arguments (4 given)”错误的解决办法
Python版本:2.7.3
使用2.7.3版本的Python时,访问MySQL的最佳方案应该数使用
MySQLdb了。
如果在执行SQL时,你遇到了上面所说的问题,那么你可能是像下面这样写导致的:

sql = "INSERT INTO my_table (field1, field2) VALUES (%s, %s)"
cursor.execute(sql, "a""b")

这是错误的,其实根本不是这样用的,当参数多于一个时,你要把它们放在一个tuple里传进去:

sql = "INSERT INTO my_table (field1, field2) VALUES (%s, %s)"
cursor.execute(sql, ("a""b"))

例如这个链接有个例子。

▶▶ 使用 lxml 库生成XML(字符串)
Python版本:2.7.3
直接看代码:

#coding:UTF-8
"""
XML生成器。文件名:xmlGenerator.py
"""

__author__ = 'Darran Zhang @ codelast.com'

from lxml import etree


class XMLGenerator:
    def __init__(self):
        pass

    def generate_xml(self):
        commands = etree.Element('Commands')
        command = etree.SubElement(commands, 'Command')
        from_user = etree.SubElement(command, 'FromUser')
        from_user.text = u'abc'
        cmd = etree.SubElement(command, 'Cmd')
        cmd.text = u'mmmmmmmmmmmmmm'
        cmd_extra_data = etree.SubElement(command, 'CmdExtraData')
        cmd_extra_data.text = u'eeeeeeeeee'

        return etree.tostring(commands, pretty_print=True, xml_declaration=True, encoding='utf-8')

测试代码:
from xmlGenerator import XMLGenerator

xmlGen = XMLGenerator()
print(xmlGen.generate_xml())

测试代码:

from xmlGenerator import XMLGenerator

xmlGen = XMLGenerator()
print(xmlGen.generate_xml())

输出:

<?xml version='1.0' encoding='utf-8'?>

<Commands>
  <Command>
    <FromUser>abc</FromUser>
    <Cmd>mmmmmmmmmmmmmm</Cmd>
    <CmdExtraData>eeeeeeeeee</CmdExtraData>
  </Command>

</Commands>

可见非常简单。

▶▶ 对一个字典(dict),按value进行排序
Python版本:2.6.6,2.6.9均测试可用(Python3里没有cmp方法了,所以不能用

sortedList = sorted(myDict.items(), lambda x, y: cmp(x[1], y[1]), reverse=True)
for (k, v) in sortedList:
    print("{0}\t{1}".format(k,v))

其中,myDict是你要将其排序的字典,sortedList是排序之后的结果,变成了一个list,里面是若干个tuple,每个tuple里是一对(key,value),所以后面用那样的方式对它进行了遍历。
文章来源:http://www.codelast.com/
▶▶ Python正则简单示例
先看代码:

code = 'String url = "http://item.jd.com/1148104.html?erpad_source=abc";'
pattern = re.compile('.*\"(.*)\"')
match = pattern.match(code)
if match:
    print(match.group(1))

输出:

http://item.jd.com/1148104.html?erpad_source=abc

说明:上面的代码是想把字符串“code”中的双引号里的那个URL打印出来。正则表达式 .*\"(.*)\" 中的小括号就是第1个group,匹配上的话可以用 group(1) 获取之。

▶▶ 循环一个日期段
Python版本:3.6.8
循环打印出 2019-07-29 ~ 2019-08-05 的日期:

import datetime


def loop_date():
    begin = datetime.date(2019729)
    end = datetime.date(201985)
    for i in range((end - begin).days + 1):
        day_str = str(begin + datetime.timedelta(days=i))
        print(day_str)


if __name__ == '__main__':
    loop_date()

输出:

2019-07-29
2019-07-30
2019-07-31
2019-08-01
2019-08-02
2019-08-03
2019-08-04
2019-08-05

文章来源:http://www.codelast.com/
▶▶ 以 yyyy-MM-dd HH:mm:ss 格式打印出当前时间
Python版本:3.6.8

import time

print(time.strftime("%Y-%m-%d %H:%M:%S"))

▶▶ 写MySQL
Python版本:3.6.8
在Anaconda下安装MySQLdb,会同时安装上的依赖包太多了,所以我转而使用 pymsql 来写MySQL:

conda install -c anaconda pymysql

之后的Python程序就非常简单了:
(1)连接MySQL

db = pymysql.connect("127.0.0.1", "root", "my_password", "my_db_name", charset='utf8')

(2)向MySQL写数据

cursor = db.cursor()
sql = "xxx"  # 必须为合法的SQL语句
cursor.execute(sql)
db.commit()

文章来源:http://www.codelast.com/
▶▶ set的 type hint 怎么写
Python版本:3.6.9
直接看代码:

from typing import Set


def type_hint_of_set() -> Set[int]:
    a = set()
    a.add(2)
    a.add(5)
    a.add(8)
    a.add(2)
    return a


b = type_hint_of_set()
print(type(b))
print(b)

输出:

<class 'set'>
{8, 2, 5}

文章来源:http://www.codelast.com/
▶▶ 用阿里镜像为 pip install 命令加速
创建文件 ~/.pip/pip.conf
添加以下内容:

[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
 
[install]
trusted-host=mirrors.aliyun.com

再使用 pip install 就会体验到飞一般的感觉。

▶▶ 使用 f string 格式化字符串时控制小数位数
Python版本:3.6.9

a: float = 32.67890123
print(f'{a:.2f}')

输出:
32.68
其中,.2表示小数点后保留两位小数。如果不加“f”,则输出变成了科学计数法:
3.3e+01

▶▶ 获取当前用户的home目录
Python版本:3.6.9

from pathlib import Path

home_dir = str(Path.home())
print(home_dir)

输出:
Mac下类似于:/Users/codelast
Linux下类似于:/home/codelast

▶▶ 计算分位数
输入文件 1.txt 一行为一个数,要看一下它们的分布情况(输入文件中的数据顺序不会影响输出结果):

import numpy as np

file = open('/home/codelast/1.txt')
list1 = []
for line in file:
    list1.append(int(line.strip()))

a = np.array(list1)
print(np.percentile(a, 0))
print(np.percentile(a, 10))
print(np.percentile(a, 20))
print(np.percentile(a, 30))
print(np.percentile(a, 40))
print(np.percentile(a, 50))
print(np.percentile(a, 60))
print(np.percentile(a, 70))
print(np.percentile(a, 80))
print(np.percentile(a, 90))
print(np.percentile(a, 100))

输出:

1.0
3.0
4.0
5.0
6.0
7.0
9.0
14.0
21.0
42.0
3572.0

这表示:有0%的值<1.0(或者说所有值都>=1.0),10%的值<3.0,20%的值<4.0,...,100%的值<=3572。

文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤ 
转载需注明出处:codelast.com 
感谢关注我的微信公众号(微信扫一扫):

wechat qrcode of codelast

发表评论