Python学习笔记



***************************Linux部分****************************
操作系统相当于桥梁,连接了硬件和应用程序。要是没有OS,其实程序也能实现直接控制硬件,但是该硬件
就不能跑其他程序了。Unix的发明者肯-汤普森就是想在一台电脑上运行一个游戏,就自己想办法用B语言
写了一个OS。后来发现兼容性差,又开发了C语言。
Unix最开始开源,后来闭源了,于是又有大神发明了mini-unix,实现相同的功能但不用你的源码。
后来又有人继续完善了minix,慢慢Linux诞生了(也是用C语言写的)。
现在很多常见的OS的老祖宗都是Unix,包括安卓、mac


如何查一个命令怎么用:
ls --help  或者  man ls
history 查看历史命令    !n 执行第n行历史命令


gedit和vim比较....


通配符(和redis一样)
*  任意0个或多个
? 任意1个
1[12345]3.txt 表示中间那位可以是1~5中的任意一个 (再详细扩展开就是正则表达式了)
注意MySQL中用 %和_


重定向:
把原本显示在终端屏幕的内容放到一个文件里面去!
ls > a.txt 覆盖
ls >> a.txt 追加


ls /home 可显示home下文件,其他目录下文件类似


cd ... 进入目录时,敲两次 tab键 可以显示当前目录下文件夹!


./ 当前  ../ 上一层  如:
想进入当前文件夹下的a文件夹,可以写 cd a 也可以 cd ./a
想回上一层: cd .. 或者 cd ../
cd -  表示回到上一次的路径,注意不一定是上一层,且这种方法最多记一次
ctrl + c 不执行该行直接到新的命令行


*********软链接和硬链接
ln -s a.txt a-softlink.txt 软链接(相当于Windows中的快捷方式)
ln a.txt a-hardlink.txt 硬链接 (删了文件再 cat a-hardlink.txt还能用,详见截图)
查文件详细信息的时候可以看到链接数


提问:怎么把两个文件合并为一个?如把a.txt, b.txt 合并为 c.txt
cat a.txt b.txt > c.txt


grep ^aaa 以aaa开头
grep bbb$ 以bbb结尾


搞了好久的输入法解决方法:先把之前的fcitx卸载了,再执行
sudo apt-get install fcitx-table-wbpy,然后重启


find不仅可以按名字找,还能按大小找等等


which ls 可以显示命令所在的路径,比如ls在/bin下


一些系统命令:
cal 查看当前日历
date 查看当前时间  date +%Y-%m-%d 以比较好的格式输出
ps -aux 查看当前进程
top 也是当前进程,但是会动态变化的,按q退出
df -h 查看当前硬盘还有多少
du -h 查看当前路径占了多大硬盘空间
ifconfig 出来的eth0其实是网卡信息,一般只有一个,虚拟机可以配置n个


*********
Linux是多任务多用户的操作系统,多用户指不退出当前用户情况下可以用另外账户操作事情
Windows其实是“假的多用户”,不允许同一时刻多个用户登录同一台电脑!
useradd diudiu -m 增加新用户,取名diudiu (-m 指同时创建家目录)
sudo passwd diudiu 给diudiu设置密码
su diudiu 切换至diudiu用户
whoami 显示当前账号名字 who 显示当前所有登录的用户的信息
exit 退出当前用户返回到之前的用户
ssh:可以远程连接到服务器(linux) 使用命令 ssh hulinku@IP地址
需要注意的是视频中用的是mac电脑,而在Windows中没有ssh命令,可以用xshell之类的软件远程连接
关于多终端:
可以在“终端”上右键-新终端,但打开的是多个窗口,看着还是不方便,那么可以用
ctrl+shift+t 开新标签,切换比较方便 


删除用户(实际中基本不用):sudo userdel diudiu 删除后家目录还留着(一般不删家),要删家 -r
su diudiu 只是切换到了diuidu,所在目录还是之前的;su - diudiu 同时切换到diudiu的家目录


注意:(Ubuntu中)su root 并不能切换到超级管理员,因为不知道密码,应该用 sudo -s 直接成为超级管理员身份
命令提示符中  $ 普通用户   # 超级管理员


用户与用户组(网络管理、运维的事,开发人员了解即可):
ll 之后 可以显示文件的拥有者,文件所属组
cat /etc/passwd 看最后一行确认账户有没有被创建
cat /etc/group 查看用户组
通过hulinku 创建出来的用户默认不在sodu组中,因此不能通过 sudo -s 切换到超级管理员,
这时执行 sudo usermod -a -G sudo diudiu 将diudiu加入到sudo组中,就可以了
谁在这个组里面就有这个组的权限!!不在就没有!


文件权限:
u---拥有者  g-----同组  o-----其他人
字母法;chmod u=x,g=wx,o=rwx a.txt
数字法: chomd 137 a.txt


*************vim
vi 命令
命令模式:
yy 复制 光标所在的这一行
4yy 复制 光标所在行向下数4行
p 粘贴
dd 删除(剪切) 光标所在的这一行
2dd 删除 光标所在行向下两行


h左 j下 k上 l右


H 定位到当前屏幕上方 
M 当前屏幕中间
L 当前屏幕下方
{ 定位到上一片代码
} 定位到下一片代码


ctrl+f 向下翻一页代码
ctrl+b 向上翻一页代码
ctrl+d 向下翻半页代码
ctrl+u 向上翻半页代码


20G 定位到第20行
G 定位到最后一行
gg 定位到第一行


w 跳到下一个单词
b 跳到前一个单词


D 从当前光标处剪切到行末尾
d0 从当前光标处剪切到行末首
x 删除当前光标处(往后删只删一个)
X 删除当前光标处(往前删只删一个)
dw 删除当前光标往后一个单词
u 撤销
ctrl+r 反撤销
. 重复上一次操作


选中一片代码:
v 光标所在
V 整个一行
>> 向右挪
<< 向左挪


r 替换当前字符
R 替换当前光标后的字符


/aaaa 查找aaaa   n 下一个   N  上一个
:%s/asd/123/g  把所有的asd替换成123


shift+zz 相当于:wq


末行模式下:
  w 保存
  q 退出
  q!不保存强制退出


vim执行shell下命令
末行模式下输入!后面跟命令


————————————————————————————————————————————————————————
一般要下载软件的方法:sudo apt-get install xxx
发现个问题:
之前我用Filezilla可以向CentOS发送文件,现在向Ubuntu发送失败。
我觉得是因为之前CentOS是服务器版本,已经配置好了,而普通桌面版的Ubuntu还得配置FTP服务器






**********************python*******************
shell脚本其实就是把一些命令扔到一个文件中,后缀名为.sh (其实别的后缀比如.py也能执行里面的命令)
比如:
touch a.sh
vim a.sh  可以写一些命令
chmod u=rwx a.sh
./a.sh  执行(里面的命令将会一次执行)
另外shell脚本里还可以加些循化等等。
一般搞运维的人得会shell脚本


注意:alt+tab 可以在两个终端窗口之间切换!!!
ipython比python功能强大,不仅可以输入Python语言,还可以输入linux命令,建议用这个。


'''
djfglkjklj   三个单引号(或双引号),实现多行注释
'''


若py文件里面有中文,python 执行报错,python3 执行可以
若要python也行的话,在py文件第一行加上 #coding=utf-8


注意:
python2和python3在对待input上是很不一样的
pytho2把输入的当做代码执行,比如输入1+4 ,输出得到5
python3当做字符串,输入1+4,输出'1+4'


type() 查看类型
*********************
python 强类型 即:
a = "18"
a < 20  报错!!
int(a) < 20 没问题!
JS弱类型 即:
var a = "18"
a < 20  没问题!!
************************


vim a.py +12 直接跳到12行,当提示12行有错时这样比较方便


if not (a > 0 and a < 10):
if...elif...elif...else...
没有do while,没有switch,没有++i等自增运算符


print("aaa",end="")  这样打印出来后就不换行了
a*=3-1 -----> a=a*2  注意给右边加括号


\t 制表符 相当于tab键,可以解决九九乘法表不对齐的情况
print("%d*%d=%d\t" %(...))
ctrl+n 自动补全


python中 + 也可以连接字符串,但是得两边都是字符串,不然报错。
"===%s==="%("asd") 也能组成新的字符串 
字符串取最后一个可以用s[-1]  逆序:s[::-1]
a.index("asd") 返回字符串asd在列表a中的索引


for 循环也是可以跟else的,只是用的很少(其他语言几乎没这样用的) for循环被break,则不执行else


注意列表的append 和 extend的区别!! append一个列表相当于把这个列表看成一个元素整体加进去!
奇怪 True,False,None 不是关键字 关键字都是小写(也有说是关键字的。。)
注意python中的空为None


*********************
元组:tuple
a = (1,2) 相当于不可修改的列表
m,n=a 那么 m=1,n=2 相当于把a拆包了,对列表和字典也适用


函数
注意先定义后使用
函数 return a,b,c 也是可以的,默认封装为一个元组返回,即 (a,b,c)
函数里使用全局变量 global
一般先写全局变量定义,再写函数定义,再调用函数
函数体的第一行写注释 """dfgfdg""" 相当于文档注释,使用help(函数名) 能够查看
函数可以指定缺省参数,只能放在参数的最后面 如:def test(a,b,c=10) 不指定c的话默认就是10
注:java中好像没有缺省参数,只能用重载?
不定长参数:
def test(a,b,*args): 参数可以是两个或多个,多余的参数以元组的形式给args
若元组中只有一个元素,则加逗号,如 a=(1,),没有元素,则a=()
完全体函数参数:
def test(a,b,c=33,*args,**kwargs):
多余的参数怎么处理:没有名字的保存到args,有名字的(命名参数)以字典形式保存到kwargs


******重点:
python中出现了 = 都是引用!
a=100  b=a
python中a,b都是引用,且他们指向同一块地址 用id(a)可以查地址
a,b都可以看做是(贴在100上的)标签,这是Python中独有的(视频中讲的有待考证)
数字、字符串、元组不可变类型;列表、字典可变
可变类型不能当key,为什么?因为字典需要根据key来做哈希算法找到value,key变了就找不到了


匿名函数:fun = lambda a,b:a+b  自带return
调用: result = fun(1,2)
匿名函数一般完成比较简单的功能,冒号后边的一定要是个表达式,能输出的东西
eval()能够把字符串当做语句执行,JS也有这个函数


虽然python中都是传引用,但是当该对象是不可变类型时,相当于又重新创建了一份;是可变类型的话
则会把原来的那份也改变。


************
对于列表等可变类型,如 a=[10]
a=a+[20] 和 a+=[20] 是不一样的!!!
深入到内存分析可知,对前一种,会先计算出等号右边的值放到一块内存中,是[10,20],再把a指向它,即
不会影响到其他的值。而对于后一种,是直接在[10]上进行操作,变成[10,20],因此之前所有引用它的
对象都会受到影响。
注:这是python独有的,在c/c++中两者一样
小总结:
Python中参数传递其实很好理解,即全是引用传递,需要改值时,能改的(可变类型)就直接改了,
不能改的(不可变类型)创建一份新的(并且指向新的)。


字符串操作:
split() 和 partition() 区别 
split()可能分成多部分,指定分割的那个字符会丢失,最后以列表保存
partition()分成三部分,不丢失,最后以元组保存
split() 不传参数情况下按照不可见的东西来切!!!
splitlines() 按照行分割,返回一个包含各行作为元素的列表


**************文件***********
在Linux中,有一句话叫 一切皆文件(包括鼠标、键盘等设备)
注意Linux中没有各种后缀之分,后缀不对一样能打开
文本文件、二进制文件(图片、音频、视频)
f = open("haha.txt","w")    f.write("fgfgfg")   f.close()
f = open("haha.txt","r")    f.read(1) 读一个字符,一开始文件指针(python没有指针,但可以
                                      这么理解)放在文件开头,读一个挪一位
f.read() 全部读出来  f.close()
f.read()与f.readlines() :
前者把所有内容转为一个字符串返回,后者返回的是一个列表,每行是一个字
符串(相当于前者再调用splitlines())
f.readline() 一次读一行
当文件很大时,直接read() 可能撑爆内存,这时可以用read(1024)一点一点读,放到while True:里面


f.tell() 返回当前文件指针位置,注意是字节不是字符!!
f.seek(a,b) 挪动文件指针,a偏移量(字节),b相对位置,可以是0,1,2
实验了一下,当文件中有中文时,把指针挪到“一个字中间”,再read(1)会出错!!


批量修改文件名:当前目录下有test文件夹,想在里面创建文件
可以cd 到test里面再创建,也可以直接:touch test/a.txt 或者 touch ./test/a.txt ./表示当前路径


*****************类和对象******************
Python在定义完类后,还能通过该类对象来添加属性!!!毕竟动态语言...
Python中没有函数重载(如果非要重载后一个会覆盖前一个),可通过默认参数、可变
参数实现类似功能,某种意义上也可以说是简化了。
因此,类中的__init()__方法也只能最多写一个!
__str__(self) 方法 当 print(对象名) 时自动调用,类似于java中的 toString(),可用于打印对象信息


设置私有属性: __属性名
设置私有方法: __方法名
__del__()


python支持多继承
一个基类默认继承了object类,即class Base(object): 和 class Base: 在python3中一样
由于多继承的存在,只用super调用父类时可能不知道调用的是哪个父类的方法(考虑方法重名的情况),
这时可以用类名.方法来区分
多态在python中体现得不明显,因为python是动态类型的,不用写出数据类型
类属性和实例属性:
多个对象共享类属性(就像java里的static属性),实例属性属于各自的,类属性可以通过类名.类属性获得
实例方法和类方法:
类方法相当于Java中的static方法,实例方法是和每个对象相关的方法
python中也有静态方法,是指和类对象无关但是又最好写到类里面的方法(和Java中的静态方法完全不一样)
********
__new__(cls): 方法:
在Java中,构造方法负责了创建对象和初始化(其实我这里是有疑问的,构造方法可能只是负责初始化,
网上也没有找到标准的答案...),而在Python中是分开的,即__new__(cls)方法只负责创建,
__init__(self)方法只负责初始化!!
注意:不是先调用__new__(cls)方法,再由__new__(cls)方法调用__init__(self)方法,而是先调用
__new__(cls)方法,再调用__init__(self)方法。


异常:
try:  except xxx:


模块:
sudo pip3 install pygame(好像不行啊)
其中pip是python管理模块的工具
如何安装pygame:
耗费了大量时间终于安装成功,直接sudo pip3 install pygame好像不行,先按照电子书步骤去一个网站上
下载了pip(之前本来有自带的,不知道为啥后来没了),然后安装电子书的安装pygame方法(一个比较长的
命令)也不行,最后尝试了sudo pip3 install pygame发现可以装上了!!
注:上面说的是python3下装pygame,如果是Linux自带的python2,那就很好装了,直接:
sudo apt-get install python-pygame


不要把文件名取为和模块名相同,比如取名为random.py不好,因为需要import random的时候优先考虑
当前路径,会自己导入自己。
import time as tt 可以取别名(当模块名很长的时候用)
当导入一个模块的时候实际上会把模块执行一遍
python中__开头__结果的东西一般都是系统的
__name__独特之处在于:自己执行和import它的人执行,它的值不一样
from XXX import * 有一个弊端,默认全部导入,要是想导入部分,可以用__all__解决
包:
__init__.py 文件夹里面写这个文件,就可以把文件夹变成一个包,导入包的时候会先执行这个文件
如果文件是空的,导入包没问题,但是用不了包里的模块,所有应该写点东西,详见视频。
找模块顺序:
先到当前路径下找,没找到再去系统默认的模块存放地找,如/usr/lib/python3.4...
模块的发布、安装!!
感觉自己打一个包挺麻烦,用了IDE以后应该就会自动打包了!!


range(10) 返回的就是一个列表!! [0,1,2...9]  或者说range()就是用来生成列表的!
range(10,18)   [10,11,...17]
注意range()有个风险,range()的数太大时会占用大量内存,python3解决了这个问题
python3中 range(10)返回range(0,10) 即没有先生成列表,而是你要的时候我再生成一个给你
那么,在python3中怎么快速生成一个列表呢?
a = [i for i in range(1,18)]    这叫列表生成式
或者 a = list(range(1,18))


集合:{1,2,3} 集合中元素不能重复
如何列表去重?先把列表转为集合 s = set(l)  再转为列表  l = list(s)


注意:
要将该字符串转为列表 s = "[1,2,3]"
直接list(s)得到的是每个字符为元素的列表!!!
应该用eval(s)来实现!!
      
*****************
注意Python和Java区别:
python中父类有参构造方法,子类可以不写构造方法,默认会去调用父类的有参构造方法
Java中父类有参构造方法,如果子类不写构造方法,编译都通不过,因为默认调用无参,而父类没有无参


结束一个函数 return
结束一个循环 break/continue
结束一个程序 exit()
 


 *********************爬虫***********************
 网页下载器urllib2原来只是针对python2的,在python3中换了别的名字,怪不得导入不了
玩爬虫得懂点正则表达式,BeautifulSoup模糊匹配的时候用的到
BeautifulSoup官网:www.crummy.com/software/BeautifulSoup/bs4/doc/ 上面有很全的用法
爬取百度百科词条:
开始输出的结果是乱码,后来加了一个<meta charset='utf-8'>就解决了



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值