Python——基础篇
〇、环境准备
安装配置
参考博客
注意:Python 2 和 Python 3 的区别
1.Python 2 中一个int包含32位,long包含64位;Python 3 取消了long型,int可以存储任意大小的整数。 2. Python 3 提供了对Unicode的支持,可以包含世界上任何书面语言以及很多特殊符号。 3. 若mac使用了zsh,则在~/.zshrc文件最后,增加一行:source ~/.bash_profile 4. 安装pip,curl https://bootstrap.pypa.io/get-pip.py -o {dir/filename},sudo python3 get-pip.py即可
错误合计
1. 修改python和pip的版本(Linux)
代码语言:javascript复制# pip/python -V来查看当前版本
# which pip/python来查看命令所在的路径,一般安装路径为/usr/lib或/usr/local/lib下
# 更改软链接前需要删除之前建立好的链接
mv /usr/bin/python /usr/bin/python.bak
ln -s /usr/bin/python3.6 /usr/bin/python
# 之后需要根据提示修改例如yum脚本第一行#!/usr/bin/python为python2
2. pip 安装、升级、卸载失败
代码语言:javascript复制# 设置windows下的代理
set http_proxy={proxyid:port}
set https_proxy={proxyid:port}
# 旧版本依赖多,不能清晰的删除,此时应该忽略旧版本升级
pip install --ignore-installed {kit-name}
# 查看pip安装路径,可以再输入一次pip install,即可根据提示“already satisfied”后的路径找到
3. pip安装超时
代码语言:javascript复制# 显示ConnectTimeoutError的WARRING时,暂时更改pip镜像源
pip install -i http://mirrors.aliyun.com/pypi/simple/ {package-name}
# 提示not a trusted or secure host导致无法找到镜像
# 源地址:http://pypi.mirrors.ustc.edu.cn/simple/;http://mirrors.aliyun.com/pypi/simple/
pip install {package-name} -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
4. 分别使用py2和py3运行pip
代码语言:javascript复制python2 -m pip install {package-name}
python3 -m pip install {package-name}
py -2 {file-name}.py
py -3 {file-name}.py
一、基本元素(原子)
代码语言:javascript复制// 对象(变量或字面值)的类型
type()
// 运算符
加法
- 减法
* 乘法
/ 浮点数除法
// 整数除法
% 模(求余)
** 幂
divmod() 返回(商,余数)
// 基数
0b或0B代表二进制
0o或0O代表八进制
0x或0X代表十六进制
// 类型转换
int()可以接受浮点数或由数字组成的字符串,但是无法接受包含小数点或指数的字符串
>>> int(98.6)
98
>>> int('-23')
-23
// 字符串
''或""中创建字符串
交互式解释器输出的字符串为单引号包裹。双引号中可以包含单引号。
三引号用于创建多行字符串,每行的换行符及行首末的空格会保留,例如
>>> poem = '''There was a Young Lady of Norway,
... Who casually sat in a door way;
... When the door squeezed her flat,
... She exclaimed, "What of that?"
... This courageous Young Lady of Norway.'''
(1)但当我们调用print() 进行打印时,Python 会在各个参数之间自动添加空格并在结尾添加换行符;
(2)可以使用字”符串*数字“来复制字符串;
(3)偏移量[]可以使用0,-1表示最左边和最右边字符;
(4)字符串不可改变。
1. 字符串操作
- slice操作 分片操作对于无效偏移量的容忍程度要远大于单字符提取操作。 在分片中,小于起始位置的 偏移量会被当作 0,大于终止位置的偏移量会被当作 -1。
[start:end:step]
# 整个字符串,等价于[:]
[0:-1]
# 提取最后三个字符
[-3:]
# 反向提取字符串,等价于[::-1]
[-1::-1]
- split() 和 join()
# 结果为list,如果待分割的字符串中包含连续的分隔符,那么在返回的列表中会出现空串元素。
string.split(',')
# 首先指定粘合用的字符串,然后再指定需要合并的列表
string.join(_list)
- 大小写操作操作
# 首字母大写
capitalize()
# 所有单词开头字母大写
title()
# 全大写
upper()
# 全小写
lower()
# 所有字符大小写互换
swapcase()
# 字符串对齐操作:center(30)、ljust(30)、rjust(30)
- 字符串分割、替换操作
# 删除指定字符
string.strip('.')
# 参数:需要被替换的子串,用于替换的新子串,以及需要替换多少处(默认只替换第一次)。可借助正则表达式。
setup.replace('a ', 'a famous ', 100)
二、列表[]、元组()、字典{}与集合{}(分子)
1. 列表(list)和元组(tuple)
序列结构,不要求所含元素的种类相同。元组(…)可变,列表[…]不可变。
(1)列表
具有相同值的元素允许出现多次,有顺序性。 可以使用list()和split()转换为list形式。列表中包含列表可以使用双重索引。
代码语言:javascript复制# 1.添加元素到最后
.append()
# 2.使用extend()或 =合并列表
# append()会将list插入到一个元素中,使用 =可以避免
# 3.del为python语句,不能通过方法形式调用
del _list[offset]
# 4.删除指定元素
_list.remove('value')
# 5.使用pop()获取并删除指定位置的元素,默认为-1
_list.pop(number)
# 6.查询具有特定值的元素位置
_list.index('value')
# 7.判断值是否存在
'value' in _list
# 8.记录特定值出现的次数
_list.count('value')
# 9.重新排列元素
# 列表方法 sort() 会对原列表进行排序,改变原列表内容;
# 通用函数 sorted() 则会返回排好序的列表副本,原列表内容不变。
sorted_list = sorted(_list)
_list.sort()
_list.sort(reverse=True) # 默认升序排列,此处改为降序排列
# 10.获取长度
len(_list)
# 11.复制,无关联。列表 copy() 函数、list() 转换函数、列表分片 [:]
b = a.copy()
c = list(a)
d = a[:]
利用list构建堆栈
代码语言:javascript复制# FIFO,队列
append() pop()
# FILO,栈
append() pop(0)
(2)元组
常量列表。函数的参数是以元组形式传递的。
代码语言:javascript复制# 1.创建,只有一个末尾也必须加','(定义元组),如果元组数大于1,最后的','可以省略
one_tuple = 'Groucho', # 或('Groucho')
many_tuple = 'Groucho', 'Chico', 'Harpo' # 或('Groucho', 'Chico', 'Harpo')
_list = ['Groucho', 'Chico', 'Harpo']
many_tuple = tuple(_list)
# 2.元组解包
a, b, c = many_tuple
tuple1 = 'abc','def'
tuple2 = '123','456'
tuple3 = 'a1','b2'
tuple1, tuple2, tuple3 = tuple2, tuple3, tuple1 # 利用元组交换值
2. 字典(dictionary/dict)
类似无序列表,通过键(key)来标识。又称关系型数组、哈希表或哈希图,{…}。
代码语言:javascript复制# 1.dict(),将包含双值子序列的序列转换成字典
lol = [['a', 'b'], ['c', 'd'], ['e', 'f']]. # 或los = ['ab', 'cd', 'ef']
dict(lol)
lol['new_key'] = 'new_value'
# 2.update(),将一个字典的键值对复制到另一个字典中去
dict1.update(dict2)
# 3.删除元素
del dict1['value']
dict1.clear()
# 4.判断某一个键是否存在于一个字典中
'key' in dict1 # 返回true or false
# 5.获取值
dict1.get('key') # 不存在返回None
dict1['key'] # 不存在会报错
dict1.keys() # 获取所有键,返回一个列表(p2)或dict_keys()键的迭代形式(p3)
dict1.values()
dict1.items()
# 6.复制,=或copy()
3. 集合(set)
无顺序性。类似舍弃了值后的字典。
代码语言:javascript复制# 1.去重set(),判断是否在内in
# 2.集合运算符
# 交集运算符&,结果是一个集合
# 或者通过集合函数 a.intersection(b)
# 并集:|、union()
# 差集:-、difference()
# 异或集(仅在两个集合中出现一次,即不同的):^、symmetric_difference()
# 子集:<=、issubset()
# 超集:>=、issuperset()(真超集:>)
三、代码结构
- Python 使用空白来区分代码结构;
- # 表示注释,出现在文本串中,将回归普通字符 # 的角色;
- 一行程序的(非强制性)最大长度建议为 80 个字符,连接符 放在行末;
- 逻辑判断
# not替代!
if {condition}:
{expression}
elif:
{expression}
else:
{expression}
以下情况会被认为是False:
Type | Value |
---|---|
布尔 | False |
null 类型 | None |
整型 | 0 |
浮点型 | 0.0 |
空字符串 | ‘’ |
空列表 | [] |
空元组 | () |
空字典 | {} |
空集合 | set() |
- 循环 如果 while 循环正常结束(没有使用 break 跳出),程序将进入到可选的 else 段。
# break, continue
while {condition}:
{expression}
else {condition}:
{expression}
# 简洁编码
# 列表(例如 rabbits)、字符串、元组、字典、集合等都是 Python 中可迭代的对象。
strs = 'abc', 'def', 'ghi' # 也可以是'cat'或dict1.items()
for str in strs:
print(str)
else {condition}:
{expression}
- 并行迭代 zip() 函数在最短序列“用完”时就会停止。
for day, fruit, drink, dessert in zip(days, fruits, drinks, desserts):
print(day, ": drink", drink, "- eat", fruit, "- enjoy", dessert)
- 生成自然数序列 range(start、stop、step)。而 start 的默认值为 0。唯一要求的参数值是 stop,产生的最后一个数的值是 stop 的前一个,并且 step 的默 认值是 1。
for x in range(2, -1, -1):
print(x)
list( range(2, -1, -1) ) # 返回的是可迭代的对象
- 推导式 (1)列表推导式[] 返回结果 for循环 条件 [expression for item in iterable if condition]
# method 1
number_list = [str(number) for number in range(1,6)]
# method 2
cells = [(row, col) for row in rows for col in cols]
# method 3
vec = [[1,2,3],[4,5,6],[7,8,9]]
result = {y for x in vec for y in x} # 返回{1,2,3,4,5,6,7,8,9}
(2)集合推导式和字典推导式把[]换成{}即可; (3)元组是没有推导式的,圆括号之间的是生成器推导式,它返回的是一个生成器对象。且一个生成器只能运行一次,列表、集合、字符串和字典都存储在内存中,但 是生成器仅在运行中产生值,不会被存下来。
- 函数 没有()时被当作对象处理。
# 如果函数不显式调用 return 函数,那么会默认返回 None。
# 可以在def时指定默认参数值
def {function}():
paas # pass表明函数没有做任何事情
# 区别None和False
def is_none(thing):
if thing is None: # is操作符
print("It's None")
elif thing:
print("It's True")
else:
print("It's False")
# 参数另一种写法,避免混淆位置参数
menu(entree='beef', dessert='bagel', wine='bordeaux')
# 1.星号将一组可变数量的位置参数集合成参数值的元组(位置参数收集)
# 2.使用两个星号可以将参数收集到一个字典中,参数的名字是字典的键,对应参数的值是字典的值(关键字参数收集)
# 如果你的 函数同时有限定的位置参数,那么 *args 会收集剩下的参数
def print_more(required1, required2, *args):
# 文档字符串
def print_if_true(thing, check):
'''
Prints the first argument if a second argument is true.
The operation is:
1. Check whether the *second* argument is true.
2. If it is, print the *first* argument.
'''
if check:
print(thing)
# 打印输出一个函数的文档字符串
help(print_if_true)
# 只打印文档字符串
print(print_if_true.__doc__)
# 闭包(内部函数,一个被动态创建的可以记录 外部变量的函数。)
# 由另一个函数动态生成的函数,并且可以改变和存储函数外创建的变量的值。
# 匿名函数:lambda()函数
- 生成器 生成器是用来创建 Python 序列的一个对象。 每次迭代生成器时,它会记录上一次调用的位置,并且返回下一个值。 生成器函数,用yield来返回值而不是return。
- 装饰器 有时你需要在不改变源代码的情况下修改已经存在的函数。 装饰器实质上是一个函数。它把一个函数作为输入并且返回另外一个函数。 靠近函数定义(def 上面)的装饰器最先执行。
>>> def document_it(func):
... def new_function(*args, **kwargs):
... print('Running function:', func.__name__)
... print('Positional arguments:', args)
... print('Keyword arguments:', kwargs)
... result = func(*args, **kwargs)
... print('Result:', result)
... return result
... return new_function
- 命名空间和作用域 global关键字可以获取全局变量。 • locals() 返回一个局部命名空间内容的字典; • globals() 返回一个全局命名空间内容的字典。
- 异常操作 except exceptiontype as name
short_list = [1, 2, 3] >>> position = 5
try:
short_list[position]
except:
print('Need a position between 0 and', len(short_list)-1, ' but got', position)
try:
position = int(value) print(short_list[position])
except IndexError as err:
print('Bad index:', position)
except Exception as other:
print('Something else broke:', other)
class UppercaseException(Exception):
pass
words = ['eeenie', 'meenie', 'miny', 'MO'] >>> for word in words:
if word.isupper():
raise UppercaseException(word)
== 注意:以两个下划线 __ 开头和结束的名称都是 Python 的保留用法。==