python中UnicodeDecodeError:'gb2312'codec can't decode bytes:illegal multibyte sequence解决办法


当使用bytes.decode("gb2312")是出现题述问题。

出现这个问题的原因是处理的字符中夹杂特殊字符是gb2312字符集中没有的,因而只需要使用更大一点的字符集GB18030去解析即可。

另外GB2312,gbk,gb18030字符集大小顺序为:GB2312 < GBK < GB18030

阅读全文 »


python中string转换为datetime


python中将string转换为datetime类型比较简单。只要注意待转换字符串格式要跟正则表达式一致。另外还需要注意年月日的代表字母,比如年是%Y

from datetime import datetime
datetime_object = datetime.strptime('2018-04-26 11:30:00', '%Y-%m-%d %H:%M:%S')
print(type(datetime_object))

输出为:

<class 'datetime.datetime'>

阅读全文 »


Ubuntu16.04下如何安装显卡驱动、cuda、cudnn


本文介绍如何在ubuntu16.04上安装nvidia显卡驱动以及cuda和cudnn。

其中nividia显卡的版本为最新版本 cuda为9.1版本 cudnn为7.1版本

介绍具体的过程。

1.安装显卡驱动

添加软件源:

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-current

查看安装信息:

lsmod | grep nvidia 

如果需要移除驱动,执行:

sudo apt-get purge nvidia*

如果需要移除软件源,执行:

sudo apt-add-repository --remove ppa:graphics-drivers/ppa

2.获取cuda和cudnn

获取安装文件有两种方式: 一种是去管网下载cuda和cudnn。 链接如下:

https://developer.nvidia.com/cuda-downloads
https://developer.nvidia.com/cudnn

第二种这里给出百度网盘的链接:

链接: https://pan.baidu.com/s/12H3yDwr_JCcGi6nuEJ1Ikg 密码: fdkz

3.## 2.安装cuda和cudnn

安装的方式比较简单,下载了安装包之后直接安装即可:

sudo dpkg -i cuda-repo-ubuntu1604-9-1-local_9.1.85-1_amd64
sudo apt-key add /var/cuda-repo-9-1-local/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda
sudo dpkg -i libcudnn7_7.1.1.5-1+cuda9.1_amd64.deb

最后,别忘了设置一下环境变量:

export LD_LIBRARY_PATH=/usr/local/cuda/lib
export PATH=$PATH:/usr/local/cuda/bin

阅读全文 »


[java]Java编译器是如何工作的


Java是半解释型的语言。Java应用程序在JVM中执行。Java程序的执行不像纯解释型语言一样有一个中间的编译步骤。Java不会编译成操作系统在CPU上执行的本地码,而是一种介于两者之间运行在虚拟机上的字节码。让我们来看看源码转换为可执行代码以及程序如何执行。

Java需要把每一个类放在它自己的源文件中(以类名和.java后缀组成)。这个基本的要求使得中型程序被分开在多个分开的源码文件中。当编译源码时,每一个类保存在它自己的文件中。类文件包含了这些字节码。Java编译器跟gcc/c++不同,事实上编译器编译某个类时,它所依赖的其他类将不被同时编译或者修改。这跟make类似,但不是完全类似。在编译好了所有的源文件之后,编译后的类文件的数目会跟源文件数目一样,这些类文件组成了java程序。类加载器会连同字节码验证器,这两个唯一的步骤区分了Java和类C/C++语言。

类加载器负责加载每一个类的字节码。Java给开发者提供了自由去编写自己的类加载器。类加载器可以加载任意位置的类,甚至是网络或者文档。N下面介绍类加载器如何加载一个类。

当JVM需要某个类时,loadClass(String name, boolean resolve);将被调用并传入类名。一旦找到包含这个类的字节码的文件,这个文件将读入类存并传递给defineClass 。如果类加载器没有找到这个类,它将委托父类加载器或者使用findSystemClass 从本地文件系统去加载。Java虚拟机规范对于什么时候进行以及如何进行字节码验证,但是通过简单的测试可以推断出defineClass完成了字节码的验证。验证器通过了4步验证法来验证字节码是否安全。在类验证和加载完成之后,就能够被运行时调用了。

原生的Java字节码允许用户很方便的反编译回源码。对于默认的编译行为,变量和方法都是可以被恢复的。用很多反编译工具,但是免费的做的好的是Jad。

阅读全文 »


python教程之3基本数据类型


上篇文章简单介绍了Python语言的基本语法,以及如何在IDE编写一个Python程序。

本文将介绍Python中的基本数据类型以及相关的操作。

基本数据类型

Python有五个标准的数据类型:

  • Numbers(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Dictionary(字典)

Python中创建变量时不需要声明具体的数据类型,由赋值时确定。比如:

i=1#整形
j=1.0#float型
k='qwer'#字符型
m=[1,2,3,4]#列表
n=(2,1,3)#元组
x={'mm':1}#字典型

基本数据类型之数值型

数值型有下面几种类型:

  • int(有符号整型)
  • float(浮点型)
  • complex(复数)

示例:

j=10#int
k=1.0#float
m=1+2j#complex,1为实部,2为虚部
n=complex(1,2)#complex,1为实部,2为虚部

注意:长整型也可以使用小写 l,但建议使用大写L,避免与数字1混淆。复数由实数部分和虚数部分构成,可以用 a + bj,或者 complex(a,b) 表示, 复数的实部 a 和虚部 b 都是浮点型。

基本数据类型之字符串

字符串或串(String)是由数字、字母、下划线组成的一串字符。

一般记为 : s=”a1a2···an”(n>=0),表示文本的数据类型。

python的字串列表有2种取值顺序:

  • 从左到右索引默认0开始的,最大范围是字符串长度少1
  • 从右到左索引默认-1开始的,最大范围是字符串开头

如果要实现从字符串中获取一段子字符串的话,可以使用变量 [头下标:尾下标],就可以截取相应的字符串,其中下标是从 0 开始算起,可以是正数或负数,下标可以为空表示取到头或尾。

比如:

str = 'Hello World!'
 
print str           # 输出完整字符串
print str[0]        # 输出字符串中的第一个字符
print str[2:5]      # 输出字符串中第三个至第五个之间的字符串
print str[2:]       # 输出从第三个字符开始的字符串
print str * 2       # 输出字符串两次
print str + "TEST"  # 输出连接的字符串

基本数据类型之列表

列表支持字符,数字,字符串甚至可以包含列表(即嵌套)。

列表用 [ ] 标识,是 python 最通用的复合数据类型。

列表中值的切割也可以用到变量 [头下标:尾下标] ,就可以截取相应的列表,从左到右索引默认 0 开始,从右到左索引默认 -1 开始,下标可以为空表示取到头或尾。

加号 + 是列表连接运算符,星号 * 是重复操作。如下实例: 实例(Python 2.0+)

list = [ 'hello', 786 , 2.23, 'world', 70.2 ]
add = [123, 'python']
 
print list               # 输出完整列表
print list[0]            # 输出列表的第一个元素
print list[1:3]          # 输出第二个至第三个元素 
print list[2:]           # 输出从第三个开始至列表末尾的所有元素
print tinylist * 2       # 输出列表两次
print list + add    # 打印组合的列表

以上实例输出结果:

['hello', 786, 2.23, 'world', 70.2]
hello
[786, 2.23]
[2.23, 'world', 70.2]
[123, 'python', 123, 'python']
['hello', 786, 2.23, 'world', 70.2, 123, 'python']

基本数据类型之元组

元组类似于List(列表),用”()”标识。内部元素用逗号,且不能二次赋值,相当于只读列表。

tuple_list = ('hello', 786, 2.23, 'world', 70.2)
add_tuple = (123, 'python')
print(tuple_list)  # 输出完整元组
print(tuple_list[0] ) # 输出元组的第一个元素
print(tuple_list[1:3] ) # 输出第二个至第三个的元素
print(tuple_list[2:])  # 输出从第三个开始至列表末尾的所有元素
print(tuple_list * 2)  # 输出元组两次
print(tuple_list + add_tuple)  # 打印组合的元组

输出为:

hello
(786, 2.23)
(2.23, 'world', 70.2)
('hello', 786, 2.23, 'world', 70.2, 'hello', 786, 2.23, 'world', 70.2)
('hello', 786, 2.23, 'world', 70.2, 123, 'python')

基本数据类型之字典

字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。

列表是有序的对象集合,字典是无序的对象集合。

两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。 字典用”{ }”标识。字典由索引(key)和它对应的值value组成。

dict = {}
dict['one'] = "This is one"
dict['two'] = "This is two"

namedict = {'name': 'ruben', 'code': 1, 'gender': 'man'}

输出如下:

{'one': 'This is one', 'two': 'This is two'}
{'name': 'ruben', 'code': 1, 'gender': 'man'}

数据类型之间的转换

Python提供了基本数据类型之间转换的内置方法:

函数 描述
int(x [,base]) 将x转换为一个整数
long(x [,base] ) 将x转换为一个长整数
float(x) 将x转换到一个浮点数
complex(real [,imag]) 创建一个复数
str(x) 将对象 x 转换为字符串
repr(x) 将对象 x 转换为表达式字符串
eval(str) 用来计算在字符串中的有效Python表达式,并返回一个对象
tuple(s) 将序列 s 转换为一个元组
list(s) 将序列 s 转换为一个列表
set(s) 转换为可变集合
dict(d) 创建一个字典。d 必须是一个序列 (key,value)元组。
frozenset(s) 转换为不可变集合
chr(x) 将一个整数转换为一个字符
unichr(x) 将一个整数转换为Unicode字符
ord(x) 将一个字符转换为它的整数值
hex(x) 将一个整数转换为一个十六进制字符串
oct(x) 将一个整数转换为一个八进制字符串

阅读全文 »


python教程之2基本语法


上篇文章简单介绍了Python语言以及IDE的搭建。

本文将介绍Python的基本语法,以及如何在IDE编写Python程序。

创建和运行第一个项目

首先打开IDE,然后选择File->New Project,之后按照下面设置:

点击Create,选择open in new window。就创建好了新的项目了。如下所示:

对着项目名右键,选择New->Python File,在弹出的输入框输入文件名,比如:

然后点击ok。双击1.hello_world.py文件,如下图所示:

复制如下代码,然后右键1.hello_world.py文件,选择Run 1.hello_world可以看到输出:

word = 'word'
sentence = "这是一个句子。"
paragraph = """这是一个段落。
包含了多个语句"""


# 文件名:1.hello_world.py

# 第一个注释
is_new=True
if is_new:
    print("Hello, World!") # 第二个注释
else:
    print("I know Python!")  # 第三个注释

到这为止就创建和运行了我们的第一个Python项目和第一个Python程序了。下面将介绍Python的基本语法,这些基本的语法是需要牢记的。

基本语法

命名规则

在编写实际的代码之前将首先介绍一下Python的基本语法,然后再进行实际的编程。

  • 在 Python里,变量或者保留字段是由字母、数字、下划线组成并区分大小写,开头可以是英文、数字或者下划线(_),但有一点不能以数字开头。

  • 以下划线开头的标识符是有特殊意义的。以单下划线开头 _name 的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 from xxx import * 而导入

  • 以双下划线开头的__name代表类的私有成员;以双下划线开头和结尾的__name__代表Python 里特殊方法专用的标识,如__init__()代表类的构造函数。

  • Python 可以同一行显示多条语句,方法是用分号 ; 分开,如: print('code1');print('code2'));

保留字段

和其他编程语言一样,Python也有自己的保留字段。保留字段不能用来定义变量并赋值。 Python中保留字段如下:

     
and exec not
assert finally or
break for pass
class from print
continue global raise
def if return
del import try
elif in while
else is with
except lambda yield

输出

Python中使用print输出,默认输出是换行的,如果要实现不换行需要在变量末尾加上逗号,。比如:

print('1')
print('1','2')

代码分块和缩进

在其他语言中,代码分块是通过{}来实现的,而Python中是通过代码的缩进以及:来实现的。 比如:

if True:
    print("True")
else:
    print("False")

这段代码相当于Java中的:

if(1){
    System.out.print('True');
    }else{
    System.out.print('False');    
    }

代码的分块是由tab键区分(也可以是任意数量的空格)进行的,可以把{}理解成用空格代替了。

在编写代码的过程中,如果没有统一的空格进行缩进,那么就会报IndentationError: unexpected indent错误。当看到这个错误时,就需要检查自己代码中缩进时候统一了。

下面是一个代码缩进的错误例子:

print('1')
    print('2')
print('3')

正确的应该是:

print('1')
print('2')
print('3')

多行语句

Python语句中一般以新行作为为语句的结束符。 但是我们可以使用斜杠( \)将一行的语句分为多行显示,如下所示:

total = item_one + \
        item_two + \
        item_three

引号

Python 可以使用引号( ‘ )、双引号( “ )、三引号( ‘’’ 或 “”” ) 来表示字符串,引号的开始与结束必须的相同类型的。 其中三引号可以由多行组成,编写多行文本的快捷语法,常用于文档字符串,在文件的特定地点,被当做注释。

word = 'word'
sentence = "这是一个句子。"
paragraph = """这是一个段落。
包含了多个语句"""

注释

python中单行注释采用 # 开头。

# 文件名:1.hello_world.py

# 第一个注释
print("Hello, World!") # 第二个注释

输出结果:

Hello, World!

好了~ 本文介绍了Python的基本语法,并编写和运行第一个Python程序。

下文将介绍Python的基本数据类型。

阅读全文 »


Ubuntu下格式化和挂载硬盘


本文介绍如何在ubuntu下格式化和挂载硬盘。

首先执行df -h命令查看系统的硬盘找到类似下面形式的盘符:

/dev/sda1       910G  708G  156G  82% /

硬盘在系统中显示为/dev/sda0/dev/sdb1之类。比如上面的就表示/dev/sda0作为/跟目录。

然后执行sudo mkfs -t ext4 /dev/sdb`命令格式化硬盘。

最后挂载:

mkdir ~/data
sudo mount /dev/sdb` ~/data

上述操作将/dev/sdb1映射到~/data目录。

阅读全文 »


python教程之1环境配置和IDE


入坑Python差不多一年了,一直想把学习经历写下来,但是总是因为懒而迟迟没有开始。

本文作为第一篇作为入门篇,首先将介绍粗略的介绍下python,然后介绍如何将python在Windows中的环境搭建起来(笔者比较喜欢用Ubuntu和sublime)。

初识Python

相信很多的读者已经了解过Python这门语言,或者已经在这做过一些尝试了。近年来Python越来越火爆,究其原因,笔者认为最大的特点是适合偷懒吧。因为Python 是一个高层次的结合了解释性、互动性和面向对象的脚本语言。

解释性

为什么说它高层次呢?举个例子,你的领导说:哎,小刘啊,你过来,我们的APP新增一个功能,大概就是要这样这样,懂了吗?你去实现吧。至于怎么实现领导就完全不管了。

在Python中,你也可以成这样的领导。举个栗子:

比如说需要下载一个网页,在java中会怎么做呢? java中需要依次完成下面的操作:

  • 构造一个URL对象
  • 打开连接
  • 构造连接属性
  • 建立连接
  • 获取响应头
  • 构造输入流
  • 从输入流中读取数据
  • 解码

java中需要正确的完成以上步骤才能下载一个网页。

而在Python只需要下面几行代码:

import requests
response = requests.get(url)
print(response.content)

引入网络模块,给get方法传入url参数,获取网页内容。完毕!

是不是很简单呢?Python是不是让事情简单了很多。

可读性

Python的代码看起来就像是人类语言,最大的区别就是没有{}。python中是使用空格来对齐的,至于空格的个数没有限制,习惯上通过tab来进行缩进。 比如:

'我是注释'
for i in range(5):
    for j in range(6):
        print(str(i*j))

上述代码通过使用一个tab的缩进来使代码分块(Java、cpp等是使用{}),并且代码块之间通过:来表示开始新的代码块。

互动性

Python 是交互式语言,设置可以通过命令行来写代码。

像图中显示的那种。Python可以直接当做计算器来用,一行输入对应一个输出。

面向对象

Python 是面向对象语言,这点这里不做过多的解释了~

下载Python

安装

打开Python的官网下载界面:https://www.python.org/downloads/。

选择python 3.6.4版本,单击既可下载了。

如果你懒得话,这里直接给出了链接

下载完毕之后,双击打开如下图所示:

选择install now就好了(也可以自定义,比如选择其他的安装路径)。然后就看到这样的界面:

完成安装之后点击close.

配置环境变量

安装好了之后,按照下面的步骤设置环境变量

  • 右键点击”计算机”,然后点击”属性”
  • 然后点击”高级系统设置”
  • 选择”系统变量”窗口下面的”Path”,双击即可!
  • 在”Path”行最前面添加python安装路径即可(默认为C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32)。记住,路径直接用英文分号”;”隔开。也就是将C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32;复制到最前面(如果不是使用默认路径为你的安装路径;)。
  • 设置成功以后,在cmd命令行,输入命令”python”,就可以有相关显示。

下载IDE

本文介绍的IDE是pycharm,打开官网链接之后选择社区版本(或者如果你懒得打开官网,直接右键下载链接另存为)。

下载之后双击,下一步完成安装。

选择Do not import settings

选择accept:

选择IDE的主题,本文选择的是Darcula:

选择Create New Project:

然后就是选择项目的保存地址和python的路径了。参照下图配置。

然后点击Create,就进入主界面了,是不是跟Android Studio很像呢?

熟悉IDE

首先下载项目代码:

git clone git@github.com:lixiang0/baike-spider.git

或者右键另存为。下载之后解压。

在IDE界面选择File->open打开刚才解压的目录。

双击spider_main.py,复制如下代码:

print('hello world!')

右键spider_main.py选择Run spider_main,如下图所示:

好了~

第一个Python程序就完成了~

下一篇文章继续吧。

阅读全文 »