文章目录
- 前言
- 官网,多查,熟能生巧
- 总结与拾遗
- 1 python关键字
- 2 内置函数, 内置库, 第三方包
- 2.1 内置函数
- 2.1.1 dir
- 2.1.2 enumerate /ɪˈnuməˌreɪt/
- 2.2 内置库
- 2.3 第三方包
- 3 python函数参数中的`*`,`/`
- 4 python中的解包
- 5 其他【不断更新!】
- 5.1 优秀的代码格式
- 5.2 python读写文本文件
- 5.3 python读写excel表
- 5.4 python获取当前文件的路径
- 5.5 求极值点
- 5.6 数据类型转换总结
- 5.7 字典排序方法
- 5.8 list reshape? //2023.1.5
- 5.9 字符串前面加b,u,r的含义
- 5.10 判断字符串是否只含空白字符
- 5.11 函数式编程 //2023.3.21
- 5.12 python程序打包为exe执行程序
- 5.13 多进程问题
- 5.14 pip更新源
- 5.15 输出带引号的字符串
- 5.16 日志输出logging模块
- 6 类的使用
前言
根据我的实践经验来看,对于有编程基础(如C语言)的同学来说,python入门应该很简单,而且加上官方文档做得非常好,所以个人建议python的学习主要去参考官网。本博客主要是记录那些容易忽略的关键点以及对个人对python中一些内容的理解。时时更新!
官网,多查,熟能生巧
- Python中文官网:https://docs.python/zh-cn/3/index.html
总结与拾遗
1 python关键字
初学python时,我当时总会有一种感觉,那就是 “python啥都写,但似乎又啥都不能写”。“啥都能写”体现在python是一门动态语言,不需要像C语言那样声明定义变量啥的,语法非常自由;而“啥都不能写”又说明python虽然自由,但也有它的语法,只要违背,一样会报错。
而关键字我认为就是学习python的第一步。通过关键字了解python的语法,从而体会其设计理念。
找到一个非常完整的教程,此处就不再赘述。链接
2 内置函数, 内置库, 第三方包
除关键字外,使用python时还需要区分内置函数,内置库以及第三方包。一些常用的库和包可以看看这个链接。
2.1 内置函数
所谓内置函数,就是指即使不导入任何包,也能直接使用的函数,比如print
。至于python当中有哪些内置函数,可以直接查看官网链接。
- python内置函数官方文档
以3.10.8版本的python为例,其所有的内置函数如下图所示。
虽然,使用python给人一种感觉就是只要会“调包”即可,但其实很多功能都能不调包,直接通过内置函数来实现。这里简单总结几个个人觉得在某些情况下特别有用的内置函数。
2.1.1 dir
dir
函数可以查看某个对象的函数,即可以用.
点出来的函数。(虽然其本质是返回__dir__
函数的内容)
还可以查看内置函数和内置变量
2.1.2 enumerate /ɪˈnuməˌreɪt/
除列表外,其实字典也是可以使用enumerate
函数的,返回的是序号和key
,如果要取其value
,还需要加个中括号。如下图所示。
2.2 内置库
所谓内置库,也叫标准库,是指在安装python安装包时就直接给安装到电脑上的一些模块,因此在使用时可以直接import
,而不需要使用pip install
命令先安装。在Windows上会直接安装所有的标准库,而在其他系统可能需要自己选择。具体有哪些标准库及其使用方法建议参考官方文档:
- python标准库官方文档——建议使用网页查找功能
2.3 第三方包
除了内置函数与内置库以外,剩下的都是第三方包了,也就是需要使用pip install
安装的库。由于第三方包非常多,因此python官网还提供了一个查询索引网站,里面有对第三方包的介绍及其官网链接。注意区分名字。
https://pypi/
以pandas
为例:
3 python函数参数中的*
,/
在使用vscode写python程序时,经常会发现在参数列表中莫名多了一个*
或者/
,如下图所示。
这个符号的作用其实是用来区分位置参数和关键字参数。关于这个在官网其实有很好的解释,如下图所示。
图片来自官网链接
4 python中的解包
参考链接
对解包最直观的理解就是如果需要传入的参数个数不确定时,可以使用*
来表示传入的参数是一个列表。或者在其他的情形下也可以使用解包的语法来实现快速操作。
还可以看看官网对解包的解释: 参考链接
5 其他【不断更新!】
5.1 优秀的代码格式
根据自己微薄的代码实践经验,总结一下个人认为比较好的代码格式。
- 变量和函数命名要有意义,如果是简写,最好在代码最上面写明简写含义;
- 函数定义时,参数要加类型注解,要注明返回值类型;
- 函数定义时,要在函数名下增加字符串解释,方便调用时查看;
- 模块化程序,尽量合成函数。
所以一般一个程序结构如下所示
# -*- coding: utf-8 -*- 支持文件中出现中文字符
#########################################################################
"""
Created on 2022.11.10
@author: Zoey
@简写说明
+ feat: feature
+ calc: calculate
+ Vec: Vector
+ chd: child
+
+
+
"""
#########################################################################
import numpy as np
import ...
#########################################################################
def func1(s:list|np.ndarray, flag:bool) -> np.ndarray: #记得加类型注解
''' @func: ...(函数功能)
@para s:...(参数列表)
flag: ...
@return: ...(返回值)
'''
...
return xxx
def func2(s:tuple)-> list:
''' @func: ...
@para s: ...
@return: ...
'''
pass
# 主函数
def main():
...
if __name__ == "__main__":
main()
5.2 python读写文本文件
在python中,一般读写文本文件有两种方式,一个是使用python的内置函数open
,一个是使用第三方库,常用的有numpy
。
open
## test.txt内容(含有字符串和数字)
# 1LSU 20190101/0015 34.1
# 1LSU 20190101/0045 34.2
# 1LSU 20190101/0115 34.5
# 1LSU 20190101/0145 33.8
# 1LSU 20190101/0215 31.9
# 1LSU 20190101/0245 31.4
with open("test.txt") as file:
A = file.read().split() #这里重点是split函数,默认以空格作为分隔符
import numpy as np
b = np.array(A).reshape(-1,3) #只有numpy类型的数据才能reshape
numpy.loadtxt
官网手册链接
其语法格式如下所示。
numpy.loadtxt(fname, dtype=<class 'float'>, comments='#',
delimiter=None, converters=None, skiprows=0, usecols=None,
unpack=False, ndmin=0, encoding='bytes', max_rows=None, *,
quotechar=None, like=None)
其中各个参数的含义如下所示
函数 | 含义 |
---|---|
fname | 文件名字符串 |
dtype | 读取到的数组中数据的格式 |
comments | 注释的起始符,即该符号后面的本行内容不再读取,继续读取下一行 |
delimiter | 数据的分隔符,可以设置为空格,逗号等 |
converters | 转换函数(不常用) |
skiprows | 跳过前面几行不读 |
usecols | 选择要读取的列 |
unpack | (不常用) |
ndmin | 返回数组的最小维度 |
encoding | 编码格式 |
max_rows | 最多可以读取多少行 |
quotechar | 引用字符,其中的内容不读取 |
like | (不常用) |
5.3 python读写excel表
python读写excel表有很多种方式,其区别只在于使用的库不同。这里总结常用的几种方式。
xlrd
&xlwt
&xlutils.copy
参考链接1
参考链接2
pandas
import pandas as pd
df=pd.read_excel('my.xlsx',engine='openpyxl',sheet_name='中国疫情')
print(df.shape) #获取文件的行数与列数
5.4 python获取当前文件的路径
参考链接
其中最为简单的用法还是直接使用__file__
的宏定义,可以直接用{}
加到字符串中。
5.5 求极值点
参考链接
5.6 数据类型转换总结
参考链接
函数 | 描述说明 |
---|---|
int(x[,base]) | 将x转为整数 |
float(x) | 将x转为浮点数 |
complex(real[,imag]) | 创建一个复数,real为实部,imag为虚部 |
str(x) | 将对象x转为字符串 |
repr(x) | 将对象x转为表达式字符串 |
eval(str) | 用来计算在字符串中的有效Python表达式,并返回表达式的值 |
tuple(s) | 将序列s转为一个元组,s可为元组、列表、字典等 |
list(s) | 将序列s转为一个列表 |
chr(x) | 将一个整数x转为一个Unicode字符,返回值是当前整数对应的 ASCII 字符 |
ord(x) | 将一个字符x转为对应ASCII整数值,返回值是当前字符对应的十进制整数 |
hex(x) | 将整数x转为十六进制字符串 |
oct(x) | 将整数x转为八进制字符串 |
bin(x) | 将整数x转为二进制字符串 |
set(s) | 将序列s转为可变集合,& | - 表示集合间的交、并、差运算 |
5.7 字典排序方法
参考链接
5.8 list reshape? //2023.1.5
需要注意,python自带的数据类型list
不支持reshape函数,需要先转换成numpy类型,再调用reshape函数!
5.9 字符串前面加b,u,r的含义
b""
:表示后续字符串为byte类型u""
:表示后续字符串编码格式为utf-8r""
:表示非转义字符串
参考链接
5.10 判断字符串是否只含空白字符
5.11 函数式编程 //2023.3.21
最近在和朋友讨论问题时发现在Python当中有一种操作叫做函数式编程,即某些函数需要传入函数和可迭代对象作为参数,从而得到可迭代对象经过函数操作之后得到的结果。
-
filter(function, iterable)
这个函数是Python内置函数。顾名思义,这个函数的主要功能是过滤,即对传入iterable
对象进行过滤操作,原理就是依次将iterable
对象中的元素代入function
函数,当函数返回True
时,则保留;当函数返回False
时则去除,最后返回保留下来的元素结合的对象。
根据官网的介绍,当function
不为None
时,它等价于[item for item in iterable if function(item)]
; 当function
为None
时,它等价于[item for item in iterable if item]
。看个例子:
-
reduce
这个函数不是内置函数,而是内置库functools
中的一个函数,这个包在官网的介绍中也是叫“函数式编程模块”:
关于reduce函数的使用,建议直接参考官网:
-
map(function, iterable, *iterables)
map函数也是Python的内置库之一,它的主要作用就是映射,将传入的函数应用于迭代器中的每个对象,然后再返回一个迭代器。
5.12 python程序打包为exe执行程序
python代码想要像C语言一样编译得到exe文件可能要稍微麻烦一点,不过也还好,python中有一个第三方包pyinstaller
可以较为方便地将py文件转换成exe文件。使用时直接在控制台输入pyinstaller <filename.py>
即可,当然,一般会加上一些参数,常用的参数如下所示。
-F
: 生成单个可执行文件-w
: 去掉控制台窗口-c –console, –nowindowed
: 使用控制台,无界面(默认)-p
: 自定义需要加载的类路径-i
: 可执行文件的图标,其后面可以加上图片的路径-D –onedir
: 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)
这些参数可以直接加在命令的后面即可。
打包程序有一点需要注意,那就是如果电脑上安装的包非常多,那么最后打包的执行程序体积也就越大,所以建议使用虚拟环境,具体操作可以查看这篇文章。
此外,通过这个模块打包的执行程序只能适用于win10,如果要在win7上运行,需要使用python3.8及以下的python版本。【参考链接】
5.13 多进程问题
找到一篇非常好的博客:
- Python——多线程以及多线程会产生的一些问题
权当收藏链接了。
5.14 pip更新源
最近才知道,原来python当中用pip安装软件也是可以像Linux上更换软件源一样更新到国内的软件源,这样装包的速度会大大提升。而且操作也很简单(更新清华源):
# 临时使用
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple <some-package>
# 永久配置
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
参考链接
5.15 输出带引号的字符串
在C语言当中,一般输出一个带引号的字符串需要加上转义字符,但是在python当中有一种更加简单的方式,那就是引号嵌套。【因为在python当中字符串单引号和双引号是等价的】
可以看出,这里用双引号输出了一个带单引号的字符串,这是可以正常输出的。当然,如果要输出两种引号,那就得加上转义字符了。
5.16 日志输出logging模块
使用方法可以参考这篇博客。
下面是一个函数例子,可以用在类当中。
def __log_init(self):
''' @func: 初始化log
@para none
@return: 返回logger对象
'''
# 创建一个logger对象
logger = logging.getLogger("sqllog")
# 创建处理函数
handle1 = logging.StreamHandler() #输出到终端的处理函数
handle2 = logging.handlers.TimedRotatingFileHandler( #输出到文件,定时删除
"./log/sql.log", #指定写入文件
interval=4, #定时删除时间间隔,默认单位为h
backupCount=100, #最后保留100个
encoding='utf-8',#指定编码格式
)
# 设置处理函数的格式和响应等级
format = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s %(funcName)s') #设置输出格式
handle1.setFormatter(format); handle2.setFormatter(format)
handle1.setLevel(logging.ERROR); handle2.setLevel(logging.ERROR)
# 关联logger和handler
logger.addHandler(handle1)
logger.addHandler(handle2)
# 返回对象
return logger
6 类的使用
关于类的使用,其实我本人之前的编程习惯是不喜欢的,感觉要比函数用起来更麻烦,不够“优雅”。因此,能够通过函数解决的问题我基本不会考虑使用类来实现(面向过程编程根深蒂固)。这也导致我一直对类还不够熟悉,趁着这次机会把官方文档好好看了一遍,梳理一下思路。
标准类的代码结构:
class subclass(baseclass): #用括号代表继承,如果有多个继承,用逗号分隔
def __init__(self) -> None: # 构造函数,用于类的初始化
super().__init__() # 父类初始化,也可以直接用父类名字
self.val = 'hello' # 对象的属性
val2 = 'world' # 类的属性
def func1(self): # 类的方法
pass
@staticmethod
def func2(): # 声明静态方法,不用加self函数
pass
item = subclass() # 实例化一个对象
x = subclass.func2() # 静态方法可以直接调用,不用实例化
这个代码有一些注意事项:
-
在类名后用括号代表继承,如果有多个继承,用逗号分隔
-
super()
函数表示该类的父类,注意:如果有多个父类继承,不要使用该函数,而是用父类名.__init__()
的方式调用。 -
一般类要加一个构造函数:
__init__()
-
一般来说,写在所有函数(方法)外的变量(属性),不需要加
self.
,它代表的是类的属性,且类中的所有函数都可以直接使用该变量。如果是声明实例化对象的属性,一般是在函数里面,首选__init__()
函数,则需要加上self.
。但是在函数中不加self.
的变量则属于是该函数的局部变量,不是类的属性。 -
关于类的属性和对象的属性怎么区分,我找到一个更好的类比例子,那就是“类中的静态函数和普通函数”。对于类的属性,可以直接调用,不用实例化一个对象。而对象的属性则需要。
更多推荐
【Python】入门,总结与拾遗
发布评论