Python笔记
近期打算认真学一学python,很早之前就看过但是一直没有毅力坚持下来,这篇笔记就当督促自己学习的动力吧!!!
一、基本知识
1,直接运行py文件
能不能像.exe文件那样直接运行.py
文件呢?在Windows上是不行的,但是,在Mac和Linux上是可以的,方法是在.py
文件的第一行加上一个特殊的注释:
1 2 | #!/usr/bin/env python3 print ( 'hello, world' ) |
然后,通过命令给hello.py
以执行权限:
1 | $ chmod a + x hello.py |
就可以直接运行hello.py
了,比如在linux下运行:
1 | . / hello.py |
2、python后台运行py程序:
1 | nohup python manage.py runserver > / usr / local / nginx / server / logs / easyQAsystem.log 2 >& 1 & |
说明:
1是标准输出(STDOUT)的文件描述符,2是标准错误(STDERR)的文件描述符
1> /usr/local/nginx/server/logs/easyQAsystem.log 简化为 > /usr/local/nginx/server/logs/easyQAsystem.log,表示把标准输出重定向到/usr/local/nginx/server/logs/easyQAsystem.log这个文件
2>&1 表示把标准错误重定向到标准输出,这里&1表示标准输出
为什么需要将标准错误重定向到标准输出的原因,是因为标准错误没有缓冲区,而STDOUT有。
这就会导致 commond > python.log 2> python.log 文件python.log被两次打开,而STDOUT和
STDERR将会竞争覆盖,这肯定不是我门想要的。好了,我们现在可以直接关闭shell窗口(我用的是SecureCRT,用的比较多的还有Xshell),而不用再输入exit这个命令来退出。
1 2 3 4 5 6 | [root@shtppATTSTPUBv01 easyQAsystem] # [root@shtppATTSTPUBv01 easyQAsystem] # nohup python manage.py runserver >/usr/local/nginx/server/logs/easyQAsystem.log 2>&1 & [1] 51576 [root@shtppATTSTPUBv01 easyQAsystem] # ps -ef|grep manage root 51576 33130 7 16:49 pts /0 00:00:00 python manage.py runserver root 51591 51576 8 16:49 pts /0 00:00:00 /usr/bin/python /opt/easyQAsystem/manage .py runserver |
3、Python代码格式
以#
开头的语句是注释,注释是给人看的,可以是任意内容,解释器会忽略掉注释。其他每一行都是一个语句,当语句以冒号:
结尾时,缩进的语句视为代码块。
缩进有利有弊。好处是强迫你写出格式化的代码,但没有规定缩进是几个空格还是Tab。按照约定俗成的管理,应该始终坚持使用4个空格的缩进。
1 2 3 4 5 6 | # print absolute value of an integer: a = 100 if a > = 0 : print (a) else : print ( - a) |
4、列表list
列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素(mutable)。
1)python列表就像数组,内存中使用堆栈进行存储。
movies=['The Holy Grail','The Life of Brain','The Meaning of Life'] print(type(movies))
movies类型为<class 'list'>
2)列表基本操作
可以使用[]加下标进行访问列表成员(下标从0开始);
使用len(列表名)获取列表长度;
列表末尾增加一个数据项append(param);
从列表末尾删除一个数据线pop();
在列表末尾增加一个数据项集合extend(params);
在列表中删除一个指定的数据项remove(param);
在列表指定位置前增加一个数据项insert(0,param);
3)列表推导式书写形式:
[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]
1 2 | nums = [ 1 , 2 , 3 ] print ([x * x for x in nums]) |
5、元组tuple
元组是静态的,长度大小固定,无法增加删减或者改变(immutable)。
1 | tup = ( 1 , 2 , 3 , 4 ) |
1)常见内置函数
可以通过 list() 和 tuple() 函数对列表和元组进行相互转换:
count(item) 表示统计列表 / 元组中 item 出现的次数。
index(item) 表示返回列表 / 元组中 item 第一次出现的索引。
list.reverse() 和 list.sort() 分别表示原地倒转列表和排序(注意,元组没有内置的这两个函数)。
reversed() 和 sorted() 同样表示对列表 / 元组进行倒转和排序,reversed() 返回一个倒转后的迭代器(上文例子使用 list() 函数再将其转换为列表);sorted() 返回排好序的新列表。
2)列表和元组的使用场景
(1)如果存储的数据和数量不变,比如你有一个函数,需要返回的是一个地点的经纬度,然后直接传给前端渲染,那么肯定选用元组更合适。
(2)如果存储的数据或数量是可变的,比如社交平台上的一个日志功能,是统计一个用户在一周之内看了哪些用户的帖子,那么则用列表更合适。
6、字典dict和集合set
1)字典
字典是一系列由键(key)和值(value)配对组成的元素的集合。相比于列表和元组,字典的性能更优,特别是对于查找、添加和删除操作,字典都能在常数时间复杂度内完成。
1 2 3 4 | d1 = { 'name' : 'jason' , 'age' : 20 , 'gender' : 'male' } d2 = dict ({ 'name' : 'jason' , 'age' : 20 , 'gender' : 'male' }) d3 = dict ([( 'name' , 'jason' ), ( 'age' , 20 ), ( 'gender' , 'male' )]) d4 = dict (name = 'jason' , age = 20 , gender = 'male' ) |
字典访问可以直接索引键,如果不存在,就会抛出异常。也可以使用 get(key, default) 函数来进行索引。如果键不存在,调用 get() 函数可以返回一个默认值。比如下面这个示例,返回了'null'。
1 2 3 4 | d = { 'name' : 'jason' , 'age' : 20 } print (d[ 'name' ]) print (d.get( 'name' )) print (d.get( 'location' , 'null' )) |
2)集合
集合和字典基本相同,唯一的区别,就是集合没有键和值的配对,是一系列无序的、唯一的元素组合。
1 2 | s1 = { 1 , 2 , 3 } s2 = set ([ 1 , 2 , 3 ]) |
集合并不支持索引操作,因为集合本质上是一个哈希表,和列表不一样。想要判断一个元素在不在字典或集合内,我们可以用 value in dict/set 来判断。
1 2 3 4 | s = { 1 , 2 , 3 } print ( 1 in s) d = { 'name' : 'jason' , 'age' : 20 } print ( 'location' in d) |
3)对字典或者集合进行操作
除了创建和访问,字典和集合也同样支持增加、删除、更新等操作。
1 2 3 4 5 6 7 8 9 10 | d = { 'name' : 'jason' , 'age' : 20 } d[ 'gender' ] = 'male' # 增加元素对'gender': 'male' d[ 'dob' ] = '1999-02-01' # 增加元素对'dob': '1999-02-01' d[ 'dob' ] = '1998-01-01' # 更新键'dob'对应的值 d.pop( 'dob' ) # 删除键为'dob'的元素对 s = { 1 , 2 , 3 } s.add( 4 ) # 增加元素4到集合 s.remove( 4 ) # 从集合中删除元素4 |
不过要注意,集合的 pop() 操作是删除集合中最后一个元素,可是集合本身是无序的,你无法知道会删除哪个元素,因此这个操作得谨慎使用。
对于字典,我们通常会根据键或值,进行升序或降序排序:
1 2 3 | d = { 'b' : 1 , 'a' : 2 , 'c' : 10 } d_sorted_by_key = sorted (d.items(), key = lambda x: x[ 0 ]) # 根据字典键的升序排序 d_sorted_by_value = sorted (d.items(), key = lambda x: x[ 1 ]) # 根据字典值的升序排序 |
而对于集合,其排序和前面讲过的列表、元组很类似,直接调用 sorted(set) 即可,结果会返回一个排好序的列表。
1 2 | s = { 3 , 4 , 2 , 1 } sorted (s) # 对集合的元素进行升序排序 |
7、字符串
字符串是由独立字符组成的一个序列,通常包含在单引号('')双引号("")或者三引号之中(''' '''或""" """,两者一样)。Python 的字符串同样支持索引,切片和遍历等等操作。
1)字符串常见函数split()
字符串的分割函数 split()。string.split(separator),表示把字符串按照 separator 分割成子字符串,并返回一个分割后子字符串组合的列表。
2)字符串常见函数format()
string.format(),就是所谓的格式化函数;而大括号{}就是所谓的格式符,用来为后面的真实值——变量 预留位置。
1 | print ( 'no data available for person with id: {}, name: {}' . format ( id , name)) |
不过要注意,string.format() 是最新的字符串格式函数与规范。自然,我们还有其他的表示方法,比如在 Python 之前版本中,字符串格式化通常用 % 来表示,那么上述的例子,就可以写成下面这样:
1 | print ( 'no data available for person with id: %s, name: %s' % ( id , name)) |
3)字符串常见函数replace()
Python 中字符串的改变,通常只能通过创建新的字符串来完成。
1 2 | s = 'hello' print (s.replace( 'h' , 'H' )) |
4)字符串加法操作符和 join 函数
1 2 3 4 5 6 7 8 9 10 | s = '' for n in range ( 0 , 5 ): s + = str (n) print (s) l = [] for n in range ( 0 , 5 ): l.append( str (n)) l = ' ' .join(l) print (l) |
Python 中字符串是不可变的(前面所讲的新版本 Python 中拼接操作’+='是个例外)。因此,随意改变字符串中字符的值,是不被允许的。
8、异常处理
通常来说,在程序中,如果我们不确定某段代码能否成功执行,往往这个地方就需要使用异常处理。我们所说的异常处理,通常使用 try 和 except 来解决。
1)处理异常
except block 只接受与它相匹配的异常类型并执行,如果程序抛出的异常并不匹配,那么程序照样会终止并退出。其中一种解决方案,是在 except block 中加入多种异常的类型。每次程序执行时,except block 中只要有一个 exception 类型与实际匹配即可。不过,很多时候,我们很难保证程序覆盖所有的异常类型,所以,更通常的做法,是在最后一个 except block,声明其处理的异常类型是 Exception。Exception 是其他所有非系统异常的基类,能够匹配任意非系统异常。或者,你也可以在 except 后面省略异常类型,这表示与任意异常相匹配(包括系统异常等)。
1 2 3 4 5 6 7 8 9 10 11 12 | try : s = input ( 'please enter two numbers separated by comma: ' ) num1 = int (s.split( ',' )[ 0 ].strip()) num2 = int (s.split( ',' )[ 1 ].strip()) except (ValueError, IndexError) as err: print ( 'Value Error: {}' . format (err)) except IndexError as err: print ( 'Index Error: {}' . format (err)) except Exception as err: print ( 'Other error: {}' . format (err)) except : print ( 'Other error' ) |
2)用户自定义异常
实际工作中,如果内置的异常类型无法满足我们的需求,或者为了让异常更加详细、可读,想增加一些异常类型的其他功能,我们可以自定义所需异常类型。不过,大多数情况下,Python 内置的异常类型就足够好了。
1 2 3 4 5 6 7 8 9 10 11 | class MyInputError(Exception): """Exception raised when there're errors in input""" def __init__( self , value): # 自定义异常类型的初始化 self .value = value def __str__( self ): # 自定义异常类型的string表达形式 return ( "{} is invalid input" . format ( repr ( self .value))) try : raise MyInputError( 1 ) # 抛出MyInputError这个异常 except MyInputError as err: print ( 'error: {}' . format (err)) |
二、常见问题解决
1、pip: failed to create process.解决方法
昨天在使用pip过程,pip提示:failed to create process。
解决方法:python -m pip install xxx 就可以了
如以matplotlib为例即:python -m pip install matplotlib 即可安装成功
2、reload() 用于重新载入之前载入的模块。
import imp imp.reload(module)
如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨小小打赏一下吧,如果囊中羞涩,不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?