Python笔记
近期打算认真学一学python,很早之前就看过但是一直没有毅力坚持下来,这篇笔记就当督促自己学习的动力吧!!!
一、基本知识
1,直接运行py文件
能不能像.exe文件那样直接运行.py
文件呢?在Windows上是不行的,但是,在Mac和Linux上是可以的,方法是在.py
文件的第一行加上一个特殊的注释:
#!/usr/bin/env python3 print('hello, world')
然后,通过命令给hello.py
以执行权限:
$ chmod a+x hello.py
就可以直接运行hello.py
了,比如在linux下运行:
./hello.py
2、python后台运行py程序:
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这个命令来退出。
[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个空格的缩进。
# 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 条件]
nums = [1, 2, 3] print([x * x for x in nums])
5、元组tuple
元组是静态的,长度大小固定,无法增加删减或者改变(immutable)。
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)配对组成的元素的集合。相比于列表和元组,字典的性能更优,特别是对于查找、添加和删除操作,字典都能在常数时间复杂度内完成。
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'。
d = {'name': 'jason', 'age': 20} print(d['name']) print(d.get('name')) print(d.get('location', 'null'))
2)集合
集合和字典基本相同,唯一的区别,就是集合没有键和值的配对,是一系列无序的、唯一的元素组合。
s1 = {1, 2, 3} s2 = set([1, 2, 3])
集合并不支持索引操作,因为集合本质上是一个哈希表,和列表不一样。想要判断一个元素在不在字典或集合内,我们可以用 value in dict/set 来判断。
s = {1, 2, 3} print(1 in s) d = {'name': 'jason', 'age': 20} print('location' in d)
3)对字典或者集合进行操作
除了创建和访问,字典和集合也同样支持增加、删除、更新等操作。
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() 操作是删除集合中最后一个元素,可是集合本身是无序的,你无法知道会删除哪个元素,因此这个操作得谨慎使用。
对于字典,我们通常会根据键或值,进行升序或降序排序:
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) 即可,结果会返回一个排好序的列表。
s = {3, 4, 2, 1} sorted(s) # 对集合的元素进行升序排序
7、字符串
字符串是由独立字符组成的一个序列,通常包含在单引号('')双引号("")或者三引号之中(''' '''或""" """,两者一样)。Python 的字符串同样支持索引,切片和遍历等等操作。
1)字符串常见函数split()
字符串的分割函数 split()。string.split(separator),表示把字符串按照 separator 分割成子字符串,并返回一个分割后子字符串组合的列表。
2)字符串常见函数format()
string.format(),就是所谓的格式化函数;而大括号{}就是所谓的格式符,用来为后面的真实值——变量 预留位置。
print('no data available for person with id: {}, name: {}'.format(id, name))
不过要注意,string.format() 是最新的字符串格式函数与规范。自然,我们还有其他的表示方法,比如在 Python 之前版本中,字符串格式化通常用 % 来表示,那么上述的例子,就可以写成下面这样:
print('no data available for person with id: %s, name: %s' % (id, name))
3)字符串常见函数replace()
Python 中字符串的改变,通常只能通过创建新的字符串来完成。
s = 'hello' print(s.replace('h','H'))
4)字符串加法操作符和 join 函数
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 后面省略异常类型,这表示与任意异常相匹配(包括系统异常等)。
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 内置的异常类型就足够好了。
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)
如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨小小打赏一下吧,如果囊中羞涩,不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.