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)

 

posted @ 2018-07-22 21:07  权杖攻城狮  阅读(392)  评论(0编辑  收藏  举报