系统运维常见问题及处理方式

1 Tomcat日志错误
1.1 java.lang.OutOfMemoryError: PermGen space
该错误是由于tomcat的bin目录下catalina.sh配置文件的内存设置过小导致的,需要修改export JAVA_OPTS=”$JAVA_OPTS -server -Xms512m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=512m -Djava.awt.headless=true”中的-XX:PermSize=128m -XX:MaxPermSize=512m的数值。其中-Xms512m -Xmx2048m代表虚拟机堆内存,-XX:PermSize=128m -XX:MaxPermSize=512m代表虚拟机的非堆内存。

2 数据库
2.1 plsql能登录数据库,sqlplus登录会报用户名/密码无效
该错误只需要重新设置下登录用户密码即可
————————————————
%title插图%num

3 Liunx常用操作
3.1 同步服务器时间
liunx crond服务查看
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看服务

3.1.1 同步服务器时间命令:root执行/usr/sbin/ntpdate 时间同步服务器ip
————————————————
%title插图%num

添加定时任务
执行vim /etc/crontab,添加定时任务命令:

%title插图%num

.1.2 也可以先把同步脚本写到shell文本里,然后定时任务调执行该脚本
ntpdata.sh

%title插图%num

在/etc/crontab中添加

%title插图%num

使用“暴力“方法防止云服务器被暴力密码破解

*近在用腾讯云的云服务器给Minecraft建立游戏服务器,但是发现服务器经常会有网络卡顿,在几经排查后发现原来是服务器一直在被人暴力密码破解,在这里便留下一个暴力方法( 关闭远程端口)防止被暴力破解心得望能帮助到各位。

安全日志审查
如果想检查自己的云服务器是否正在被暴力密码破解,可以从事件查看器的安全日志中获得相关信息。经过具体检查,发现对方很鸡贼,每一次的登陆ip都是不同的,一般的ip屏蔽方法不太适用。
%title插图%num

反暴力破解
由于是云服务器,无法更改用户名(Administrator)同时也无法修改远程桌面的端口(3389),对方又很“聪明”的一直换ip暴力破解我的云服务器,无奈之下,我只能使出比他还“暴力”的方法。

1 关闭远程端口
一般服务器的使用都是作为网站或游戏等专用服务器,其实本身对服务器的操作并不需要很多,所以可以通过允许\拒*远程桌面端口的方式来*其简单的防止暴力破解密码。
一般的云服务器厂家都会有安全组配置的功能,所以我就使用安全组将远程端口(3389)关闭,防止对方暴力破解密码。
以下以腾讯云服务器为示例:

%title插图%num

如果想对服务器再次进行操作,只需要修改端口为允许再登录即可。

2 更改远程端口
详细的方法腾讯云有官方文档,关于windows和linux服务器的详细修改步骤均在文档里有写,这里将链接分享给大家:修改云服务器远程默认端口

小结
更改远程端口是十分有效的反暴力破解方法,但是其劣势也是可见的,就是端口处于暴露状态,仍有可能被暴力尝试获取可用的端口。虽然说通过端口开关的方法进行反暴力密码破解比较麻烦(每次登录和下线都需要先登录网页开关 ,也太麻烦了 ),但是也是从根源上杜*了暴力密码破解的问题。服务器的大多数用途并不是登录和使用,所以这个方法在多数情况下应该还是可行性很高的,希望可以帮到大家!

SSM搭建项目常见错误——Mybatis篇

1 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):com.scor.dao.XX.XX
当mapper.xml文件放在resources目录下时的解决方法有如下两种:

mapper.xml所在的包名与dao.java所在的包名一致;
若包名不一致则需要在spring-dao.xml中指定mapper.xml的路径,如下

————————————————
%title插图%num

当mapper.xml文件放在java目录下时的解决方法:

  1. 点击project structure,将mapper.xml所在的包设置为Resources文件夹,再在spring-dao.xml中指定mapper.xml的路径
  2. %title插图%num
  3. %title插图%num

Python类属性和方法的调用

Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。

一、类、对象概述
在面向对象程序设计中,把数据以及对数据的操作封装在一起,组成一个整体(对象),不同对象之间通过消息机制来通信或者同步。对于相同类型的对象进行分类、抽象后,得出共同的特征而形成了类。
类的抽象具体包括两个方面:
1.数据抽象:描述某类对象共有的属性或状态。
2.过程抽象:描述某类对象共有的行为或功能操作。
在python中,使用类来定义同一种类型的对象。类是广义的数据类型,能够定义复杂数据的特性,包括:
1.静态特性(即数据抽象):创建类时用变量形式表示对象特征的成员称为属性(数据成员)。
2.动态特性(即行为抽象,也就是对数据的操作方法):用函数形式表示对象行为的成员称为成员方法,数据成员和成员方法统称为类的成员。
类是实现代码复用和设计复用的一个重要方法,封装、继承、多态是面向对象程序设计的三个要素。
类是生成对象的抽象模板,对象是根据类创建出来的一个个具体的实例。
二、类的定义与使用
Python使用class关键字来定义类,class关键字之后是一个空格,接下来是类的名字,如果派生自其它基类的话则需要把所有父类放到一对圆括号中并使用逗号分隔,然后是一个冒号,*后换行并定义类的内部实现。
类名的首字母一般要大写。
class Car(object): #定义一个类,派生自object类(所有类的祖先,定义类时不存在其他父类就写object)
can_move=True #定义类属性
def infor(self): #定义成员方法
print(“This is a car”)
1
2
3
4
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的*个参数名称, 按照惯例它的名称是 self(self代表类的实例,而非类;self 不是 python 关键字,我们把他换成其他也是可以正常执行的)。
三、类属性和类方法的调用
定义了类之后,就可以用来实例化对象,并通过“对象名.成员”的方式来访问其中的数据成员或成员方法。

>>>spring=Bird() #实例化对象
>>>print(Bird.have_feather) #通过类名调用属性
>>>print(Bird.have_head) #通过对象名调用属性
>>>spring.move() #通过对象名调用方法
>
1
2
3
4
5

类方法大体分为 3 类,分别是类方法、实例方法和静态方法,其中实例方法用的是*多的。我们知道,实例方法的调用方式其实有 2种,既可以采用类对象调用,也可以直接通过类名调用。
通常情况下,我们习惯使用类对象调用类中的实例方法。但如果想用类调用实例方法,不能像如下这样:

class Study:
def info(self):
print(“学 Python”)
#通过类名直接调用实例方法
Study.info()
1
2
3
4
5
运行上面代码,程序会报出如下错误:

Traceback (most recent call last):
File “D:\python3.6\demo.py”, line 5, in <module>
Study.info()
TypeError: info() missing 1 required positional argument: ‘self’
1
2
3
4
其中,*后一行报错信息提示我们,调用 info() 类方式时缺少给 self 参数传参。这意味着,和使用类对象调用实例方法不同,通过类名直接调用实例方法时,Python 并不会自动给 self 参数传值。
读者想想也应该明白,self 参数需要的是方法的实际调用者(是类对象),而这里只提供了类名,当然无法自动传值。

因此,如果想通过类名直接调用实例方法,就必须手动为 self 参数传值。例如修改上面的代码为:

class Study:
def info(self):
print(“学 Python”)
clang = Study()
#通过类名直接调用实例方法
Study.info(clang)
1
2
3
4
5
6
再次运行程序,结果为:

学 Python
1
可以看到,通过手动将 clang 这个类对象传给了 self 参数,使得程序得以正确执行。实际上,这里调用实例方法的形式完全是等价于 clang.info()。

值得一提的是,上面的报错信息只是让我们手动为 self 参数传值,但并没有规定必须传一个该类的对象,其实完全可以任意传入一个参数,例如:

class Study:
def info(self):
print(self,”学 Python”)
#通过类名直接调用实例方法
Study.info(“zhangsan”)
1
2
3
4
5
运行结果为:

zhangsan 学 Python
1
可以看到,“zhangsan” 这个字符串传给了 info() 方法的 self 参数。显然,无论是 info() 方法中使用 self 参数调用其它类方法,还是使用 self 参数定义新的实例变量,胡乱的给 self 参数传参都将会导致程序运行崩溃。

总的来说,Python 中允许使用类名直接调用实例方法,但必须手动为该方法的*个 self 参数传递参数,这种调用方法的方式被称为“非绑定方法”。
用类的实例对象访问类成员的方式称为绑定方法,而用类名调用类成员的方式称为非绑定方法。
(此处参考)

四、私有成员与公有成员
私有成员在类的外部不能直接访问,一般是在类的内部进行访问和操作,或者在类的外部通过调用对象的公有成员方法来访问,而公有成员是可以公开使用的,既可以在类的内部进行访问,也可以在外部程序中使用。
从形式上看,在定义类的成员时,如果成员名以两个下划线开头但是不以两个下划线结束则表示是私有成员,否则就不是私有成员。
Python并没有对私有成员提供严格的访问保护机制,通过一种特殊方式“对象名._类名__xxx”也可以在外部程序中访问私有成员,但这会破坏类的封装性,不建议这样做。

在Python中,以下划线开头的变量名和方法名有特殊的含义,尤其是在类的定义中。
_xxx:受保护成员;
__xxx__:系统定义的特殊成员;
__xxx:私有成员,只有类对象自己能访问,子类对象不能直接访问到这个成员,但在对象外部可以通过“对象名._类名__xxx”这样的特殊方式来访问。
1
2
3
注意:Python中不存在严格意义上的私有成员。
————————————————

Python类的定义与使用

Python类的定义与使用

 

目标:

1.类的定义

2.父类,子类定义,以及子类调用父类

3.类的组合使用

4.内置功能

 

1.类的定义

代码如下:

 

  1. #!/usr/bin/env python
  2. #coding:utf8
  3. class Hotel(object):
  4. “””docstring for Hotel”””
  5. def __init__(self, room, cf=1.0, br=15):
  6. self.room = room
  7. self.cf = cf
  8. self.br = br
  9. def cacl_all(self, days=1):
  10. return (self.room * self.cf + self.br) * days
  11. if __name__ == ‘__main__’:
  12. stdroom = Hotel(200)
  13. big_room = Hotel(230, 0.9)
  14. print stdroom.cacl_all()
  15. print stdroom.cacl_all(2)
  16. print big_room.cacl_all()
  17. print big_room.cacl_all(3)

 

2.父类、子类以及调用父类

代码如下:

 

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # 父类
  4. class AddBook(object):
  5. def __init__(self, name, phone):
  6. self.name = name
  7. self.phone = phone
  8. def get_phone(self):
  9. return self.phone
  10. # 子类,继承
  11. class EmplEmail(AddBook):
  12. def __init__(self, nm, ph, email):
  13. # AddBook.__init__(self, nm, ph) # 调用父类方法一
  14. super(EmplEmail, self).__init__(nm, ph) # 调用父类方法二
  15. self.email = email
  16. def get_email(self):
  17. return self.email
  18. # 调用
  19. if __name__ == “__main__”:
  20. Detian = AddBook(‘handetian’, ‘18210413001’)
  21. Meng = AddBook(‘shaomeng’, ‘18210413002’)
  22. print Detian.get_phone()
  23. print AddBook.get_phone(Meng)
  24. alice = EmplEmail(‘alice’, ‘18210418888’, ‘[email protected]’)
  25. print alice.get_email(), alice.get_phone()

 

3.类的组合使用

代码如下:

 

 

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. ”’
  4. 1.class类的组合使用
  5. 2.手机、邮箱、QQ等是可以变化的(定义在一起),姓名不可变(单独定义)。
  6. 3.在另一个类中引用
  7. ”’
  8. class Info(object):
  9. def __init__(self, phone, email, qq):
  10. self.phone = phone
  11. self.email = email
  12. self.qq = qq
  13. def get_phone(self):
  14. return self.phone
  15. def update_phone(self, newphone):
  16. self.phone = newphone
  17. print “手机号更改已更改”
  18. def get_email(self):
  19. return self.email
  20. class AddrBook(object):
  21. ”’docstring for AddBook”’
  22. def __init__(self, name, phone, email, qq):
  23. self.name = name
  24. self.info = Info(phone, email, qq)
  25. if __name__ == “__main__”:
  26. Detian = AddrBook(‘handetian’, ‘18210413001’, ‘[email protected]’, ‘123456’)
  27. print Detian.info.get_phone()
  28. Detian.info.update_phone(18210413002)
  29. print Detian.info.get_phone()
  30. print Detian.info.get_email()

 

 

 

4.内置功能(函数()加与不加的区别)

代码如下:

 

 

  1. #!/usr/bin/env python
  2. #coding:utf8
  3. class Books(object):
  4. def __init__(self, title, author):
  5. self.title = title
  6. self.author = author
  7. def __str__(self):
  8. return self.title
  9. def __repr__(self):
  10. return self.title
  11. def __call__(self):
  12. print “%s is written by %s” %(self.title, self.author)
  13. if __name__ == ‘__main__’:
  14. pybook = Books(‘Core Python’, ‘Wesley’)
  15. print pybook
  16. pybook()

 

  1. #!/usr/bin/env python
  2. #coding:utf8
  3. class Number(object):
  4. “””Custum object
  5. add/radd -> +;
  6. sub/rsub -> -;
  7. mul/rmul -> *;
  8. div/rdiv -> /;
  9. “””
  10. def __init__(self, number):
  11. self.number = number
  12. def __add__(self, other):
  13. return self.number + other
  14. def __radd__(self, other):
  15. return self.number + other
  16. def __sub__(self, other):
  17. return self.number – other
  18. def __rsub__(self, other):
  19. return other – self.number
  20. def __gt__(self, other):
  21. if self.number > other:
  22. return True
  23. return False
  24. if __name__ == ‘__main__’:
  25. num = Number(10)
  26. print num + 20
  27. print 30 + num
  28. print num – 5
  29. print 11 – num
  30. print num > 20

 

位于同一局域网段的云服务器怎么购买呢?

要搭建一个集群,必须要求所有节点在同一局域网

现在云服务器怎么做到买的是同一局域网的呢

有些云服务器厂商有虚拟交换机( VSwitch )的配置,虚拟交换机连接的局域网网络性能怎么样呢?

ps: 求推荐性价比高的服务器提供商,配置 4c32g SSD 以上,dmca ignored 或者 offshare *好..

yfwl 1
yfwl 48 天前
内网云服务器很简单的,offshare 可以 dmca ignored 不保证… BASE64:UVEyMzI3Njc3NTk2
calmzhu 2
calmzhu 48 天前 via Android ❤️ 1
aws azure aliyun 华为这些全部有 vpc 网络的 。
opengps 3
opengps 48 天前 via Android ❤️ 1
局域网现在都是用 vpc 实现,买之前提前规划好网关交换机信息,把机器选到这个交换机下
zhuzhibin 4
zhuzhibin 48 天前 via iPhone
VPC
stanchenxxx2015 5
stanchenxxx2015 48 天前
VPC 配一个就妥了
freecloud 6
freecloud 48 天前
/t/751066 腾讯云轻量,同账号同机房,应该是内网直接互通的。二月份,还有免费升配的活动。
lry 7
lry 47 天前
@yfwl
@freecloud
国内的机器都不考虑 一是不方便 二是价钱太贵了 🙂
freecloud 8
freecloud 46 天前
@lry 海外轻量,可以考虑下。24 元 /月起,再加代理折扣。
yfwl 9
yfwl 45 天前
有海外的.. 谁说没有,海外内网也很简单

百度UEditor粘贴或插入的表格不显示边框的解决办法

这个方法是我自己研究出来的。

编辑器里面可以看到表格有边框,在前台页面展示出来的却没有边框。

修改办法:

打开ueditor.all.js

1、找到下面的代码,修改

utils.each(tables, function (table) {
removeStyleSize(table, true);
domUtils.removeAttributes(table, [‘style’]); //改这里,原来是 [‘style’, ‘border’]
utils.each(domUtils.getElementsByTagName(table, “td”), function (td) {
if (isEmptyBlock(td)) {
domUtils.fillNode(me.document, td);
}
removeStyleSize(td, true);
});
});
这是为了不让UEditor去掉粘贴的表格的边框,也就是table元素的border属性(不是border内联样式)

2、UEditor插入的表格实际是没有边框的,编辑器中看到边框,其实是因为编辑器里面(<iframe>中)有下面这个全局css
td,th{ border:1px solid #DDD; }
但是前台展示是没有这段全局css的,所以导致看不到边框。

我们可以让编辑器中无边框的表格,显示成虚线灰色的边框,这也是其他很多html编辑器的处理方式。

找到并修改下面的代码

utils.cssRule(‘table’,
//选中的td上的样式
‘.selectTdClass{background-color:#edf5fa !important}’ +
‘table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}’ +
//插入的表格的默认样式
‘table{margin-bottom:10px;border-collapse:collapse;display:table;}’ +
‘td,th{padding: 5px 10px;border: 1px dashed #DDD;}’ + //这里修改 1px solid #DDD 为 1px dashed #DDD
‘caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}’ +
‘th{border-top:1px dashed #BBB;background-color:#F7F7F7;}’ + //这里修改 1px solid #BBB 为 1px dashed #BBB
‘table tr.firstRow th{border-top-width:2px;}’ +
‘.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }’ +
‘td p{margin:0;padding:0;}’, me.document);
目的是让全局的td/th边框样式显示为灰色虚线

3、*后就是table上右键菜单中有个”表格-设置表格边线可见”的功能。这个功能会让表格显示出实线边框,实际前台展示也是有边框的。

现在td是有实线边框的,可是th却还是虚线,所以要改下面的代码,增加一段对th的处理

注意:th就是表格标题列/行。可以用右键菜单”表格-插入表格标题列/行”插入th

execCommand: function () {
var table = getTableItemsByRange(this).table;
utils.each(domUtils.getElementsByTagName(table,’td’),function(td){
td.style.borderWidth = ‘1px’;
td.style.borderStyle = ‘solid’;
td.style.borderColor = ‘windowtext’;
});
//增加下面一段
utils.each(domUtils.getElementsByTagName(table,’th’),function(th){
th.style.borderWidth = domUtils.getComputedStyle(th, “border-width”);
th.style.borderStyle = ‘solid’;
th.style.borderColor = ‘windowtext’;
});
}

*后如果你用的是ueditor.all.min.js,需要将改过的代码压缩一份min版本。

————————————————

VScode连接远程服务器上的jupyter notebook

工欲善其事,必先利其器,开发工具这个东西觉得折腾下还是有好处的。但常常感觉专门抽出时间搞这个浪费时间,更常见的现象是已经明显感觉到当前的开发工具用的很别扭,而且告诉自己等这个忙完了要搭一个更方便的工具,到*后却没下文了直到下次再次遇到这种感觉。我这会就是再次遇到了,想用VSCode连接服务器上的jupyter notebook运行tensorflow代码,这样在本地的VScode中直接写代码就方便了很多。整个过程很简单,我自诩记性也不错,但还是不如这白纸黑字来的保险,查资料也是很花时间的。

首先是本机与服务器之间配置ssh就不仔细描述了,要是忘了google一下“ssh远程登录服务器”大把都是资料而且大多数说的都是对的。但*好在~/.ssh/config中按照下面的样子再配置下,ssh用起来会更方便的。

%title插图%num

接下来是vscode这边要能远程连接到服务器上,记住不是在本地写代码然后再发送到服务器上,而是直接连接到了服务器的某个路径下,VScode对文件的增删改查就相当于是操作了服务器上这个路径下的对应文件(也许说的比较啰嗦,但是觉得概念还是要清楚的)。实现这个目的只需要3步:

1、在扩展(EXTENSIONS)中搜插件Remote – SSH安装后再重新启动VScode。
2、鼠标点击VScode左下角的齿轮选择命令模式(command paletten),mac对应的快捷键是shift+cmd+p。
3、在VScode顶部中间弹出的下拉菜单中输入Remote – SSH点击图片中选中的选项,接下来再点击你要连接的服务器的名字就行了,*后会弹出一个新的VSCode。
vscode现在就可以远程连接服务器了,如果想写python代码,直接创建文件就可以了。

%title插图%num

%title插图%num

而服务器这边要能够创建jupyter noteboot,也就是些安装了,不难就是找起来有点麻烦。我喜欢用conda安装一个虚拟环境就是因为隔离了干净省心,真要是搞坏了直接删了重新建一个。服务器上的操作也只需要3步:

1、安装虚拟环境:

conda create –name notebook python=3.6
2、激活虚拟环境并安装jupyter notebook:

source activate notebook
conda install -c conda-forge jupyter notebook
3、创建一个notebook服务:

sudo jupyter notebook –port=8889 –allow-root
结果如下:*下面的两个URL就是刚才启动的服务的地址,我复制http://localhost:8889/?token=aef9a514fa484b83aa4554371024ebc5b50bbed25c2521ab,当然复制另一个也没问题。

%title插图%num

*后在已经连接到服务器的VScode中进入命令模式,点击下图下拉菜单中被选中的选项(好绕口,理解就好)。意思也很明显:指定一个本地或者远程的jupyter服务连接。

%title插图%num

把刚才复制的URL粘贴进去,按回车。

%title插图%num

创建一个jupyter文件测试下:

%title插图%num

整个过程就这么简单而且内容也不多,但就是写了快两个小时吧,正好有今晚有时间就整理一下,以后就不需要google再去各种找了。后面几张大图看起来好丑,感觉以后要学一些有关排版设计的内容了,忽然想起自己曾今自学了一段时间PS,好久没用这会好像也忘差不多了。回头自己读刚才写的blog隐隐约约有种很着急的感觉,不知道是思维还是文笔的锅,总之有时间就多写写,“感觉”也是可以慢慢积累的呢~。

Spring MVC+Mybatis常见错误及解决

1

org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [0, 1, param1, param2]

出现这个错误是由于在执行sql的时候无法匹配sql语句的通配符造成的,有两个解决方法:
<1>、在对应dao的xml文件的sql语句要这样写

<select id=”findByUsernameAndPassword” resultType=”com.lzcc.model.User”>
select * from user where username = #{0} and password = #{1};
</select>
1
2
3
<2>、在dao接口的方法中的参数中添加@param注解
————————————————

List<User> findByUsernameAndPassword(@Param(“username”) String username,@Param(“password”) String password) throws SQLException;
————————————————

Python是什么

Python是什么

python 中文就是蟒蛇的意思。
在计算机中,它是一种编程语言。
Python(英语发音:/ˈpaɪθən/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,*个公开发行版发行于1991年。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的*终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C++重写。
1,发展历程编辑
自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程。Python[1] 已经成为*受欢迎的程序设计语言之一。2011年1月,它被TIOBE编程语言排行榜评为2010年度语言。自从2004年以后,python的使用率是呈线性增长[2] 。
由于Python语言的简洁、易读以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学
已经采用Python教授程序设计课程。例如卡耐基梅隆大学的编程基础和麻省理工学院的计算机科学及编程导论就使用Python语言讲授。众多开源的科学
计算软件包都提供了Python的调用接口,
例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而Python专用的科学计算扩展库就更多了,例如如下3个十分经典的
科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功能。因此Python语
言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。
说起科学计算,首先会被提到的可能是MATLAB。然而除了MATLAB的一些专业性很强的工具箱还无法替代之外,MATLAB的大部分常用功能都可以在Python世界中找到相应的扩展库。和MATLAB相比,用Python做科学计算有如下优点:
● 首先,MATLAB是一款商用软件,并且价格不菲。而Python完全免费,众多开源的科学计算库都提供了Python的调用接口。用户可以在任何计算机上免费安装Python及其*大多数扩展库。
● 其次,与MATLAB相比,Python是一门更易学、更严谨的程序设计语言。它能让用户编写出更易读、易维护的代码。
● *后,MATLAB主要专注于工程和科学计算。然而即使在计算领域,也经常会遇到文件管理、界面设计、网络通信等各种需求。而Python有着丰富的扩展库,可以轻易完成各种高级任务,开发者可以用Python实现完整应用程序所需的各种功能。%title插图%num
2,产生
Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承。之所以选中Python(大蟒蛇的意思)作为程序的名字,是因为他是一个叫Monty Python的喜剧团体的爱好者。
ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC
这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido 认为是非开放造成的。Guido
决心在Python 中避免这一错误。同时,他还想实现在ABC 中闪现过但未曾实现的东西。
就这样,Python在Guido手中诞生了。可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell和C的习惯。
3,风格
Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。
设计者开发时总的指导思想是,对于一个特定的问题,只要有一种*好的方法来解决就好了。这在由Tim
Peters写的Python格言(称为The Zen of Python)里面表述为:There should be one– and
preferably only one –obvious way to do it. 这正好和Perl语言(另一种功能类似的高级动态语言)的中心思想TMTOWTDI(There’s More Than One Way To Do It)完全相反。
Python的作者有意的设计限制性很强的语法,使得不好的编程习惯(例如if语句的下一行不向右缩进)都不能通过编译。其中很重要的一项就是Python的缩进规则。
一个和其他大多数语言(如C)的区别就是,一个模块的界限,完全是由每行的首字符在这一行的位置来决定的(而C语言
是用一对花括号{}来明确的定出模块的边界的,与字符的位置毫无关系)。这一点曾经引起过争议。因为自从C这类的语言诞生后,语言的语法含义与字符的排列
方式分离开来,曾经被认为是一种程序语言的进步。不过不可否认的是,通过强制程序员们缩进(包括if,for和函数定义等所有需要使用模块的地方),Python确实使得程序更加清晰和美观。
4,设计定位
Python的设计哲学是“优雅”、“明确”、“简单”。因此,Perl语言中“总是有多种方法来做同一件事”的理念在Python开发者中通常是难以忍受的。
Python开发者的哲学是“用一种方法,*好是只有一种方法来做一件事”。在设计Python语言时,如果面临多种选择,Python开发者一般会拒*
花俏的语法,而选择明确的没有或者很少有歧义的语法。由于这种设计观念的差异,Python源代码通常被认为比Perl具备更好的可读性,并且能够支撑大
规模的软件开发。这些准则被称为Python格言。在Python解释器内运行import this可以获得完整的列表。
Python开发人员尽量避开不成熟或者不重要的优化。一些针对非重要部位的加快运行速度的补丁通常不会被合并到Python内。所以很多人认为Python很慢。不过,根据二八定律,大多数程序对速度要求不高。在某些对运行速度要求很高的情况,Python设计师
倾向于使用JIT技术,或者用使用C/C++语言改写这部分程序。可用的JIT技术是PyPy。
Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。
虽然Python可能被粗略地分类为“脚本语言”(script language),但实际上一些大规模软件开发计划例如Zope、Mnet及BitTorrent,Google也广泛地使用它。Python的支持者较喜欢称它为一种高级动态编程语言,原因是“脚本语言”泛指仅作简单程序设计任务的语言,如shellscript、VBScript等只能处理简单任务的编程语言,并不能与Python相提并论。
Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和
工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。Python编译器本身也可以被集成到其它需要脚本语言的程序内。因此,很
多人还把Python作为一种“胶水语言”(glue
language)使用。使用Python将其他语言编写的程序进行集成和封装。在Google内部的很多项目,例如Google
Engine使用C++编写性能要求*高的部分,然后用Python或Java/Go调用相应的模块。《Python技术手册》的作者马特利(AlexMartelli)说:“这很难讲,不过,2004 年,Python 已在 Google 内部使用,Google 召募许多 Python高手,但在这之前就已决定使用Python,他们的目的是 Python where we can, C++ where we
must,在操控硬件的场合使用 C++,在快速开发时候使用 Python。”

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速