本文目录一览:
1、Python笔记:命令行参数解析 2、Python笔记--查找以及更改python解析器的位置 3、[python自学笔记一 基础输出](#python自学笔记一 基础输出) 4、Python笔记——'utf-8' codec can't decode byte 0xc5 in position 0: invalid continuation byte 5、Python笔记:Python装饰器 6、Python笔记-取模运算%
Python笔记:命令行参数解析
有些时候我们需要通过命令行将参数传递给脚本,C语言中有个 getopt()
方法,Python中也有一个类似的命令行参数解析方法 getopt()
。Python也提供了比 getopt()
更简洁的 argparse
方法。另外,sys
模块也可以实现简单的参数解析,本文将对这3种命令行参数解析方法简要介绍。
sys.argv
是传入的参数列表,sys.argv[0]
是当前 Python 脚本的名称,sys.argv[1]
表示第一个参数,以此类推。
命令行运行:
可以看到传入的参数通过 sys.argv
来获取,它就是一个参数列表。
Python 的 getopt
与 C 语言的 getopt()
函数类似。相比于 sys
模块,支持长参数和短参数,并对参数解析赋值。但它需要结合 sys
模块进行参数解析,语法格式如下:
短参数为单个英文字母,如果必须赋值需要在后面加英文冒号 (:
),长参数一般为字符串(相比短参数,更能说明参数含义),如果必须赋值需要在后面加等号 (=
)。
命令行运行:
注意:短参数 (options
) 和长参数 (long_options
) 不需要一一对应,可以任意顺序,也可以只有短参数或者只有长参数。
argparse
模块提供了很多可以设置的参数,例如参数的默认值、帮助消息、参数的数据类型等。argparse
类主要包括 ArgumentParser
、add_argument
和 parse_args
三个方法。
下面介绍这三个函数的使用方法。
argparse
默认提供了 -h | --help
参数:
命令行运行:
下面列出部分参数:
下面来添加参数:
命令行运行:
parse_args()
方法用于解析参数,在前面的示例代码中使用 parse_args
方法来提取参数值,对于无效或者错误的参数会打印错误信息和帮助信息:
命令行运行:
本文介绍了 Python 的三种命令行参数解析方法 sys.argv
、getopt
和 argparse
,可以根据自己的需要进行选择。getopt
和 argparse
两种方法相比来说,建议选择 argparse
,代码量更少更简洁。更详细的使用方法参考官方文档:
--THE END--
Python笔记--查找以及更改python解析器的位置
- 图中箭头所指即为 Python 解析器的位置
- 在 PyCharm:File → Settings → Python Interpreter → 设置 → Add → New Environment → Base Interpreter 将路径粘到这里选择
.exe
文件;Existing Environment 同理。
python自学笔记一 基础输出
print("我是python小白")
终端输出:我是python小白。
此种写法只用于了解 print
函数的作用,在程序中要输出某个内容,一般采用变量的形式,即:
my = "小白"
print("我是python%s。" % my)
终端输出:我是python小白。
此处 my
为变量,"小白" 是被赋值给变量 my
,并不是 my
等于变量。定义变量的好处是一个程序可以无限次数地使用它。定义变量还可以为:
a = b = c = 2 # 2 同时赋值给 a、b、c 三个变量
a, b, c = 1, 2, 3 # a=1, b=2, c=3
注意:变量名区分大小写,不能以数字开头。
name, age, weight = "小白", 18, 65.5
stuid = 1
print("我的名字是%s, 我的年龄是%d, 我的体重是%f公斤, 我的学号是%d" % (name, age, weight, stuid))
终端输出:我的名字是小白,我的年龄是18岁,我的体重是65.500000公斤,我的学号是1。
print("我的名字是%s, 我的年龄是%d岁, 我的体重是%.2f公斤,我的学号是%03d" % (name, age, weight, stuid))
终端输出:我的名字是小白,我的年龄是18岁,我的体重是65.50公斤,我的学号是001。
print(f"我的名字是{name},我明年的年龄是{age + 1}岁, 我的体重是{weight}公斤,我的学号是00{stuid}")
此种写法为最常用的。
终端输出:我的名字是小白,我明年的年龄是19岁,我的体重是65.5公斤,我的学号是001。
%d
为整数型函数值,%03d
表示以3位整数显示,不足的以0替代,超出的原样显示。%f
为小数型函数值,%.2f
表示只显示小数点后两位。%s
为字符型函数值,字符串应以双引号或单引号括起。
Python笔记——'utf-8' codec can't decode byte 0xc5 in position 0: invalid continuation byte
在读取数据时出现如下错误:
'utf-8' codec can't decode byte 0xc5 in position 0: invalid continuation byte
该报错说明 CSV 文件不是 UTF-8 编码形式,有两种方法可以解决:
- 改变 CSV 文件的编码,可以用记事本打开 CSV 文件再将其另存为 UTF-8 编码形式并覆盖原文件。
- 先查看 CSV 文件是什么编码,我的 CSV 文件为 ANSI 编码,然后再添加参数
encoding='ANSI'
。
Python笔记:Python装饰器
装饰器是通过装饰器函数修改原函数的一些功能而不需要修改原函数,在很多场景可以用到它,比如:
- 执行某个测试用例之前,判断是否需要登录或者执行某些特定操作;
- 统计某个函数的执行时间;
- 判断输入合法性等。
合理使用装饰器可以极大地提高程序的可读性以及运行效率。本文将介绍 Python 装饰器的使用方法。
Python 装饰器可以定义如下:
输出:
Python 解释器将
test_decorator
函数作为参数传递给my_decorator
函数,并指向了内部函数wrapper()
,内部函数wrapper()
又会调用原函数test_decorator()
,所以decorator()
的执行会先打印'this is wrapper'
,然后打印'hello world'
,test_decorator()
执行完成后,打印'bye'
。*args
和**kwargs
表示接受任意数量和类型的参数。 装饰器my_decorator()
把真正需要执行的函数test_decorator()
包裹在其中,并且改变了它的行为,但是原函数test_decorator()
不变。 一般使用如下形式使用装饰器:
@my_decorator
def test_decorator():
print("hello world")
就相当于:
decorator = my_decorator(test_decorator)
内置装饰器 @functools.wraps
可用于保留原函数的元信息(将原函数的元信息,拷贝到对应的装饰器函数里)。先来看看没有使用 functools
的情况:
输出:
从上面的输出可以看出 test_decorator()
函数被装饰以后元信息被 wrapper()
函数取代了,可以使用 @functools.wraps
装饰器保留原函数的元信息:
输出:
装饰器可以接受自定义参数。比如定义一个参数来设置装饰器内部函数的执行次数:
输出:
Python 支持多个装饰器嵌套:
装饰的过程:
顺序从里到外:
test_decorator('hello world')
执行顺序和装饰的过程相反。
输出:
类也可以作为装饰器,类装饰器主要依赖 __call__()
方法,是 Python 中所有能被调用的对象具有的内置方法(Python 魔术方法),每当调用一个类的实例时,__call__()
就会被执行一次。
下面的类装饰器实现统计函数执行次数:
输出:
下面介绍两种装饰器使用场景:
统计函数执行所花费的时间:
输出:
在使用某些 Web 服务时,需要先判断用户是否登录,如果没有登录就跳转到登录页面或者提示用户登录:
--THE END--
Python笔记-取模运算%
对于该算术运算符 %
,取模运算存在如下定理:
对于一个正整数而言,一定存在等式:
a = b * q + r
代表 a
可以被拆分成最多 q
个 b
并且余下一个 r
,此时称 a % b = r
。
例如:正整数 17
,存在等式 17 = 3 * 5 + 2
,即 17 % 5 = 2
。
这里介绍一下数学中的一种运算:取余运算。
两者在对正整数的运算中完全没有区别,但是对于负整数的运算,则会存在一定的区别。
但是要记住下面这句话,就可以很好地进行区分:
- 取余公式中的 k 要向 0 靠拢,也就是如果大于等于 0,那就要向下取整;如果小于 0,那就要向上取整。
- 取模公式中的 k 要向负无穷靠拢,不管什么情况,都是向下取整。 或者是:
- 向上取整
math.ceil()
可以理解成要选择大于等于该数值的整数部分的最小整数; - 向下取整
math.floor()
可以理解成要选择小于等于该数值的整数部分的最大整数。 也就是: 下面做些实际运算,加深一下印象: