文章目录

  • 前言
  • 官网,多查,熟能生巧
  • 总结与拾遗
    • 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-8
  • r"":表示非转义字符串

参考链接

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)]; 当functionNone时,它等价于[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】入门,总结与拾遗