python、linux随笔

python安装、基础语法

多平台安装anaconda

  • 可以从这个链接下载anaconda,国内的镜像下载速度非常快
    清华大学开源软件镜像站-anaconda
windows系统安装anaconda,注意点(add path),自动添加环境变量的选项
linux系统安装anaconda
  1. 首先我们需要安装一个linux(centos7)
  2. 配置网络
vim /etc/sysconfig/network-scripts/ifcfg-ens33

将ONBOOT=no改为yes
将BOOTPROTO=dhcp改为BOOTPROTO=static,并在后面增加几行内容:
IPADDR=192.168.127.128
NETMASK=255.255.255.0
GATEWAY=192.168.127.2
DNS1=114.114.114.114

重启网络
systemctl restart network
  1. 配置yum源(linux软件包管理器)
离线yum源
离线yum源

cd /etc/yum.repo.d/
vi aa.repo

[aa]
name=aa
enable=1
gpgcheck=0
baseurl=file:///mnt
--------------------
umount /原路径
以下两种:临时、永久
1. vi /etc/fstab   #里面修改要挂载的路径
    mount -a
2. mount /dev/sr0 /mnt

yum clean all
yum makecache
在线更换阿里yum源
1、备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

3、生成缓存
yum makecache
下载安装必要的软件包
yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake kernel-devel bzip2 wget vim net-tools
临时关闭、永久关闭、开启防火墙的方法
systemctl start firewalld.service
systemctl stop firewalld.service
systemctl restart firewalld.service
systemctl disable firewalld.service
systemctl enable firewalld.service
临时关闭、永久关闭、开启selinux的方法
setenforce 0 #设置selinux为permissive模式(即关闭)
setenforce 1 #设置selinux为enforcing模式(即开启)
selinux ‐‐disabled 关闭selinux
安装anaconda
  1. 一路yes
  2. 中间有一个选择安装路径的地方 /root/Anaconda3 >> 这里需要输入安装路径
  3. 还有一个询问是否自动配置环境变量,如在root用户下安装的anaconda,环境变量自动配置在了/root/.bashrc文件下,也可以手动配置环境变量
export PATH=安装路径:$PATH
  1. /etc/profile 系统环境变量
  2. ~/.bashrc 用户环境变量
注意:无论是哪一种,配置文件修改了,一定是需要重新加载才生效的,source一下即可
通过修改.bashrc文件:
vim ~/.bashrc
//在最后一行添上:
export PATH="/root/anaconda3/bin:$PATH"
生效方法:(有以下两种)
1、关闭当前终端窗口,重新打开一个新终端窗口就能生效
2、输入“source ~/.bashrc”命令,立即生效
有效期限:永久有效
用户局限:仅对当前用户

通过修改profile文件:
vim /etc/profile
/export PATH //找到设置PATH的行,添加
export PATH="/root/anaconda3/bin:$PATH"
有效期限:永久有效
用户局限:对所有用户

yum whatprovides */ftp

  • 安装ftp服务
yum -y install vsftpd
systemctl start vsftpd.service
systemctl status vsftpd.service

cd:切换目标路径
lcd:查看当前路径或切换当前路径
prompt:关闭交互,例如mget下载多个文件,没下载一个都要选择y/n,prompt模式默认为y,无需交互
binary:设定传输方式为二进制
put/send:上传
get:下载单个文件,文件名不支持通配符
mget:下载多个,支持通配符

ftp> ascii # 设定以ASCII方式传送文件(缺省值) 
ftp> bell  # 每完成一次文件传送,报警提示. 
ftp> binary # 设定以二进制方式传送文件. 
ftp> bye  # 终止主机FTP进程,并退出FTP管理方式. 
ftp> case # 当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母. 
ftp> cd   # 同UNIX的CD命令. 
ftp> cdup  # 返回上一级目录. 
ftp> chmod # 改变远端主机的文件权限. 
ftp> close # 终止远端的FTP进程,返回到FTP命令状态, 所有的宏定义都被删除. 
ftp> delete # 删除远端主机中的文件. 
ftp> dir [remote-directory] [local-file] # 列出当前远端主机目录中的文件.如果有本地文件,就将结果写至本地文件. 
ftp> get [remote-file] [local-file] # 从远端主机中传送至本地主机中. 
ftp> help [command] # 输出命令的解释. 
ftp> lcd # 改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录. 
ftp> ls [remote-directory] [local-file] # 同DIR. 
ftp> macdef         # 定义宏命令. 
ftp> mdelete [remote-files] # 删除一批文件. 
ftp> mget [remote-files]  # 从远端主机接收一批文件至本地主机. 
ftp> mkdir directory-name  # 在远端主机中建立目录. 
ftp> mput local-files # 将本地主机中一批文件传送至远端主机. 
ftp> open host [port] # 重新建立一个新的连接. 
ftp> prompt      # 交互提示模式. 
ftp> put local-file [remote-file] # 将本地一个文件传送至远端主机中. 
ftp> pwd # 列出当前远端主机目录. 
ftp> quit # 同BYE. 
ftp> recv remote-file [local-file] # 同GET. 
ftp> rename [from] [to]   # 改变远端主机中的文件名. 
ftp> rmdir directory-name  # 删除远端主机中的目录. 
ftp> send local-file [remote-file] # 同PUT. 
ftp> status  # 显示当前FTP的状态. 
ftp> system  # 显示远端主机系统类型. 
ftp> user user-name [password] [account] # 重新以别的用户名登录远端主机. 
ftp> ? [command] # 同HELP. [command]指定需要帮助的命令名称。如果没有指定 command,ftp 将显示全部命令的列表。
ftp> ! # 从 ftp 子系统退出到外壳。
  • sftp与ssh是同样的服务
centos系统自带openssh服务,但是版本低,有漏洞
ssh -V
cd 路径                        更改远程目录到“路径” 
lcd 路径                       更改本地目录到“路径” 
chgrp group path               将文件“path”的组更改为“group” 
chmod mode path                将文件“path”的权限更改为“mode” 
chown owner path               将文件“path”的属主更改为“owner” 
exit                           退出 sftp 
help                           显示这个帮助文本 
get 远程路径                    下载文件 
ls [选项] [路径]                显示远程目录列表 
lls [选项] [路径]               显示本地目录列表 
mkdir 路径                      创建远程目录 
lmkdir 路径                     创建本地目录 
mv oldpath newpath             移动远程文件 
open [用户@]主机[:端口]          连接到远程主机 
put 本地路径                    上传文件 
pwd                            显示远程工作目录 
lpwd                           打印本地工作目录 
quit                           退出 sftp 
rmdir 路径                     移除远程目录 
lrmdir 路径                    移除本地目录 
rm 路径                        删除远程文件 
lrm 路径                       删除本地文件 
version                        显示协议版本

百度百科-入门扯淡
Python是一种解释型脚本语言,可以应用于以下领域:


Web 和 Internet开发 (豆瓣、知乎、YouTube) flask django


科学计算和统计 pandas numpy


人工智能 机器学习:sckit-learn 深度学习:tensorflow pytorch


桌面界面开发 (GUI) pyqt5


网络爬虫 scrapy selenium


自动化运维 telnetlib官方文档 paramiko ftplib


特点

  • 跨平台
  • 面向对象
  • 交互式
  • 弱类型
  1. 变量 不需要指定类型
  2. 基本数据类型:

标准数据类型

Python3 中有六个标准的数据类型:

  • Number(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Set(集合)
  • Dictionary(字典)

Python3 的六个标准数据类型中:

  • 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
  • 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
Number(数字)
  • Python3 支持 int、float、bool、complex(复数)。
  • 1、Python可以同时为多个变量赋值,如a, b = 1, 2。
  • 2、一个变量可以通过赋值指向不同类型的对象。
  • 3、数值的除法包含两个运算符:/ 返回一个浮点数,// 返回一个整数。
  • 4、在混合计算时,Python会把整型转换成为浮点数。
  • + - * / // % **
  • +=
  • > >= != == < <=
  • or and not
  • in
  • is 存储单元是否一致

字符串常用操作

str.isdigit()  #判断str是否均由数字组成
strx.lower()  小写    upper  大写   swapcase()  大转小,小转大  capitalize()  首字母大写,其余小写   title()  每个单词的首字母大写
str.find("xxx")     从头找到尾,返回第一次出现的下标;rfind  从右向左;find("xxx",0,7)  从0-7查找xxx,返回索引,找不到返回-1
strip   lstrip   rstrip   默认为去空
split
".".join(ll)   list转字符串
startswith("xxx",5,16)   判断在给定的范围内,判断是否以给定的字符串开头
endswith()
字符串切片
str[起始位置:结束位置:步长]

查询索引

(1)s.find(字符或者字符串) s.find(字符或者字符串,起始索引,结束索引)
(2)s.index(字符或者字符串)
s.index(字符或者字符串,起始索引,结束索引)
  • 二者均是字符或者字符串索引查询,默认从左往右,查找到第一个即返回。
  • 区别在于:find查找不到返回-1,index找不到报错

判断:

(1)s.isalpha():字符串中的元素是否全为字符
(2)s.isalnum():字符串是否含有数字和字符混合,返回值为bool
(3)s.isdigit():字符串中的元素是否全为数字
(4)s.isspace():字符串中除了空格返回值全为False
(5)s.islower()
(6)s.isupper()
List
  • 1 list.append(obj)
    在列表末尾添加新的对象
  • 2 list.count(obj)
    统计某个元素在列表中出现的次数
  • 3 list.extend(seq)
    在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
  • 4 list.index(obj)
    从列表中找出某个值第一个匹配项的索引位置
  • 5 list.insert(index, obj)
    将对象插入列表
  • 6 list.pop([index=-1])
    移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
  • 7 list.remove(obj)
    移除列表中某个值的第一个匹配项
  • 8 list.reverse()
    反向列表中元素
  • 9 list.sort( key=None, reverse=False)
    对原列表进行排序
  • 10 list.clear()
    清空列表
  • b=a b=copy(a) b = copy.deepcopy(a)

字典的遍历:

  • items() keys() values()
  • dict.clear()
  • dict.pop(key)

语法糖

一些常见的语法糖

a = 1; b = 2; c = 3
b, c = c, b
a < c < b < 5
'1' * 100
[1,2,3,4] + [5,6,7,8]

切片操作

l = [1, 2, 3, 4, 5]
l[2]
l[:3]
l[3:]
l[2:4]
l[:-1]
l[:]
l[::2]

with语法

with open('example_2.txt', 'r', encoding='utf-8') as f:
    for line in f:
        print(line, end='')

else语法糖

  • 主要有for-else,while-else,try-else。
  • 需要注意的是,for-else和while-else需要和break语句配合时使用。
  • for else
for i in range(1):
    print(i)
    break
else:
    print('for end')
  • while else
i = 1
while i:
    print(i)
    i -= 1
    break
else:
    print('while end')
  • try else
try:
    1 / 1
except Exception as e:
    print('except occured')
else:
    print('it is fine')
finally:
    print('i am finally')

函数相关语法糖

def example_dynamic_args(*args, **kwargs):
    '''动态参数'''
    print(args)  # tuple
    print(kwargs)  # 字典

匿名函数

  • 第一种用法
g=lambda x: x * 2
g(2)  ==> 4
  • 第二种用法,与filter、reduce、map搭配使用

map 遍历处理

items = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, items))

# output:
[1, 4, 9, 16, 25]

filter 筛选

items = [1, 2, 3, 4, 5]
squared = list(filter(lambda x: x%2==1, items))

# output:
[1, 3,5]

reduce 计算出一个值

from functools import reduce
product = reduce( (lambda x, y: x * y), [1, 2, 3, 4] )

# Output: 
24

推导表达式

  • 列表推导表达式
in_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7]
print('array before:', in_list)
array = [i for i in in_list if i % 2 != 0] # 列表推导表达式
print('array after:', array)
  • 生成器推导表达式
in_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7]
print('array before:', in_list)
array = (i for i in in_list if i % 2 != 0) 
print('array after:', array)
  • 集合推导表达式
in_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7]
print('array before:', in_list)
array = {i for i in in_list if i % 2 != 0} # 集合推导表达式
print('array after:', array)
  • 字典推导表达式
in_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7]
print('array before:', in_list)
array = {i: i * 2 for i in in_list if i % 2 != 0}  # 字典推导表达式
print('array after:', array)
  • yield表达式

yield语法也是Python中比较有特点的语法糖,可以说是特有的。虽然其它语言有实现类似机制的功能。

yield是Python中实现协程(coroutine)的一个重要基础。

def example_generator(in_list):
    '''生成器'''
    for i in in_list:
        yield i * 2
g=example_generator([1,2,3])
next(g)    #调用一次,执行一次example_generator函数,并接着上次的继续循环
for i in g:
    print(i)    #这个虽然没使用next,但是也可以循环打印g这个生成器里的东西,这是为什么? 下面说明:

list 可以通过 iter(list) 这样的方法转换为生成器

for…in… 循环的本质

for item in Iterable

循环的本质就是先通过iter()函数获取可迭代对象 Iterable 的迭代器,然后对获取到的迭代器不断调用 next() 方法来获取下一个值并将其赋值给 item,当遇到 StopIteration 的异常后循环结束 (for…in..会自动处理 StopIteration 异常)。

  • 装饰器

重要的往往在最后面,装饰器是学习Python绕不过去的坎。就像学习Java要理解面向对象和设计模式一样。

学习Python,你就应该要掌握好闭包、生成器、装饰器等相关知识。而对于编写高并发程序时则要掌握协程相关知识。

  • 在本质上,闭包是将函数内部和函数外部连接起来的桥梁
def example_decorator(func):
    '''装饰器'''
    def inner():
        func()
 
    return inner
@example_decorator

正则表达式;python的re模块

flags

re.I    使匹配对大小写不敏感  IGNORECASE
re.L    做本地化识别(locale-aware)匹配 LOCALE
re.M    多行匹配,影响 ^ 和 $    MULTILINE
re.S    使 . 匹配包括换行在内的所有字符     DOTALL
re.U    根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X    该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。  VERBOSE
import re

re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
.group()
.group(1)   .group(2)

re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配。
.group() 找到的字符串全部输出
.group(1)   .group(2) 
.groups()   没用过

re.findall()

返回list

re.sub(pattern, repl, string, count=0, flags=0)

用于替换字符串中的匹配项。
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
flags : 编译时用的匹配模式,数字形式。

模式表达式?(我的理解就是各种通配符)

.:匹配任意字符,除了换行符,当re.DOTALL(多行模式,flags=re.DOTALL)标记被指定时,则可以匹配包括换行符的任意字符。
^:^xxx,以xxx开头;在[]中括号中表示非[^0-9]代表非数字。
*:匹配0个或多个的表达式。
+:匹配1个或多个的表达式。
?:匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式。通俗地讲,就是尽可能的少匹配。 ?一般搭配数量使用。
|:或。
{0,},{,3},{1,5}:0次以上,最多三次,1到5次。
():匹配括号内的表达式,也表示一个组。
\d:匹配一个数字字符。等价于 [0-9]。
\D:匹配一个非数字字符。等价于 [^0-9]。
\s:匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S:匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w:匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W:匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

re.match(r"c:\a",mm).group()  不做字符串转义,\就是\。

根据左边括号数编号,0是整个模式,1是从左到右第一个括号,类推:例如
//AABB
(.)\1(.)\2    也可以(.)(\1)(.)(\3) 
//AAAB
(.)\1\1.
//ABBB
.(.)\1\1
//ABAB
(.)(.)\1\2

type()  查看类型
len()   查看长度


文件读取

读写文件

r rb w wb a a+ ab ab+

read readline readlines 个人理解,一般不会用到readline,因为小文件readlines可以达到与他一样的效果,但是效率高的多;
如果是大文件那就直接使用read,循环读取,还是要比readline()效率高;
当然一切依情况而定。

with open("path",'r',encoding='gbk',errors='ignore') as f
    f.read()

大文件读取

def read_in_chunks(filePath, chunk_size=1024*1024):
    """    Lazy function (generator) to read a file piece by piece.    
    Default chunk size: 1M    You can set your own chunk size     """     
    with open(filePath,'r',encoding='utf-8') as f:     
        while True:       
            chunk_data = f.read(chunk_size)        
            if not chunk_data:            
                break        
            yield chunk_data
        
if __name__ == "__main__":    
    filePath = 'test.txt'    
    for chunk in read_in_chunks(filePath): 
        print(chunk)

类和对象,面向对象的学习

  • 快速入门例子:
Class People():
    
  • 方法

1> 实例方法——方法内部需要访问 实例属性

实例方法 内部可以使用 类名.访问类属性

2> 类方法——方法内部 只 需要访问 类属性

@classmethod

3> 静态方法——方法内部,不需要访问 实例属性 和 类属性

@staticmethod

进程

线程

协程

其他常用的操作

=========================================================

你可能感兴趣的:(python、linux随笔)