“人生苦短,我学python”是编程届的名言。用python写小脚本的便捷性,让不少其余语言的学习者把python看成辅助语言。拥有了某一个语言的功底,再来学习另一种语言应该是十分快速的。编程理念都十分类似,只是看看语言的差别性。带着Java的基础,学习Python,准备上路了。html
安装好python环境后,运行win+R,输入python直接进入python的交互页面,这边能够进行数学运算。java
>>> 2+2
4
复制代码
表1 数学操做符,优先级从高到低python
操做符 | 操做 | 例子 | 值 |
---|---|---|---|
** | 指数 | 2 ** 3 | 8 |
% | 取模/取余数 | 22 % 8 | 6 |
// | 整除/商数取整 | 22 // 8 | 2 |
/ | 除法 | 22 / 8 | 2.75 |
* | 乘法 | 3 * 5 | 15 |
- | 减法 | 5 - 2 | 3 |
+ | 加法 | 2 + 2 | 4 |
由上面能够看出python前两个基础类型 整数、 浮点类型。这两个和java中的概念差很少。编程
做为基础的类型,固然少不了字符串了,和java同样,字符串能够进行拼接操做。例如:数组
>>> 'AAA' + 'BBB'
'AAABBB'
>>> 'CCC'+25
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
>>> 'DEF'*3
'DEFDEFDEF'
复制代码
如上,‘AAA’+'BBB'能够直接进行字符串的拼接。可是与java不一样的是 python不会进行类型强制转化,因此当用字符串‘CCC’+int型的25的时候就会报错。对python进行*操做,字符串会进行复制。bash
这边插一段,在java中进行变量声明的时候,须要指定变量类型,在python中不须要,可是python变量名也须要必定的规则。多线程
为了让int型的5能够转化成字符串类型,从而和字符串拼接,python提供了一些内置函数。
表2 一些python内置函数app
函数 | 做用 | 示例 |
---|---|---|
str() | 转化类型为字符串 | str(5) |
int() | 转化类型为整数 | int('5') |
float() | 转化类型为浮点数 | float('5') |
print() | 打印函数 | 略 |
input() | 读取用户输入数据 | myName = input() |
len() | 内容长度 | len(myName) |
如今引入第四个数据类型,布尔值。python的布尔值也是有真或者假,可是python中的真为True(注意T必须大写),假为False(F也必须为大写),一样的布尔类型不能与其余类型相比较。dom
>>> True
True
>>> true
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'true' is not defined
>>> True = 1
File "<stdin>", line 1
SyntaxError: can't assign to keyword 复制代码
表3 比较类型编程语言
操做符 | 含义 |
---|---|
== | 等于 |
!= | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
同时python也可使用二元操做符 and、or、not同java中的与、或、非。
你前面看到的布尔表达式能够当作是条件,它和表达式是一回事。“条件”只是在 控制流语句的上下文中更具体的名称。条件老是求值为一个布尔值,True 或 False。控制 流语句根据条件是 True 仍是 False,来决定作什么。几乎全部的控制流语句都使用条件。
python没有java中那种{}来区分代码块,python中全部的代码块都是经过缩进进行的。
>>> if 'a'=='b':
... print('真')
... else:
... print('假')
...
假
复制代码
以上是一个if else 的控制流,条件后面加上冒号,而且代码块须要缩进方式。
while循环的格式以下:
spam = 0
while spam < 5:
print('Hello, world.')
spam = spam + 1
复制代码
另外 python 也有break 和continue 关键字可使用。
for循环单另儿拿出来以示尊重,for循环的格式以下:
for 关键字;
一个变量名;
in 关键字;
调用 range()方法,最多传入 3 个参数;
冒号;
从下一行开始,缩退的代码块(称为 for 子句)。
for i in range(5):
print('Jimmy Five Times (' + str(i) + ')')
复制代码
i分别执行0、一、二、三、4.
range()方法其实有三个参数,只是能够省略其中两个。range(start、end、gap),能够指定开始、结束和步长。
>>> for i in range(0,10,3):
... print(i)
...
0
3
6
9
复制代码
Python 程序能够调用一组基本的函数,这称为“内建函数”,包括你见到过的print()、input()和 len()函数。Python 也包括一组模块,称为“标准库”。每一个模块都是一个 Python 程序,包含一组相关的函数,能够嵌入你的程序之中。例如,math模块有数学运算相关的函数,random 模块有随机数相关的函数,等等。
利用import或者from import语句
除了内建函数,大部分的函数都是自定义的。(即便从模块中导入的函数也是别人自定义好的,让你使用的)
def hello(name):
print('Hello ' + name)
复制代码
def 函数名(参数):
函数体
在Python中有一个值称为None,它表示没有值。None是NoneType数据类型的惟一值(其余编程语言可能称这个值为null、nil或 undefined)。就像布尔值True和False同样,None必须大写首字母 N。
def temp_convert(var):
try:
return int(var)
except ValueError, Argument:
print "参数没有包含数字\n", Argument
复制代码
相似于java,python捕获处理一场用的是try,except,只不过在except后面除了能够跟异常类(好比例子中的ValueError),还能够跟上引起一场的参数(好比例子中的Argument,其实就是try中的var)
列表能够看做java中的数组集合,能够存放一些元素,好比>>> spam = ['cat', 'bat', 'rat', 'elephant']。咱们能够经过index获取某个元素,好比spam[0]=‘cat’,同时能够从后往前拿数据,好比spam[-1]='elephant'。
除了直接操做index,获取某个元素以外,还能够经过切片得到一段子列表。
>>> spam[1:3]
['bat', 'rat']
>>> spam[0:-1]
['cat', 'bat', 'rat']
复制代码
与java不一样的是,python的列表能够自由的拼接复制。
>>> [1, 2, 3] + ['A', 'B', 'C']
[1, 2, 3, 'A', 'B', 'C']
>>> ['X', 'Y', 'Z'] * 3
['X', 'Y', 'Z', 'X', 'Y', 'Z', 'X', 'Y', 'Z']
复制代码
删除某列表中的某元素,能够直接用del关键字。
也能够结合for循环
>>> supplies = ['pens', 'staplers', 'flame-throwers', 'binders']
>>> for i in range(len(supplies)):
print('Index ' + str(i) + ' in supplies is: ' + supplies[i])
复制代码
>>> 'howdy' in ['hello', 'hi', 'howdy', 'heyas']
True
>>> spam = ['hello', 'hi', 'howdy', 'heyas']
>>> 'cat' in spam
False
复制代码
>>> spam = ['Zophie', 'Pooka', 'Fat-tail', 'Pooka']
>>> spam.index('Pooka')
1
复制代码
用 append()和 insert()方法在列表中添加值
append()方法调用,将参数添加到列表末尾。insert()方法能够在列表任意下标处插入一个值。insert()方法的第一个参数是新值的下标,第二个参数是要插入的新值。
用remove()方法从列表中删除值
用sort()方法将列表中的值排序
在java中,咱们知道String 是被final修饰的,因此String自己是不能修改的,若是对String进行修改,实际上是在内存中新建了一个新的String。相似的python中也有一个不可修改的数据类型——元组。元组和列表差很少,不少方法都是共通的。只不过,元组是用"()"表示,而且元组内的元素不能被修改,也不能对元组进行增长删除操做。
函数list()和tuple()将返回传递给它们的值的列表和元组版本。
>>> tuple(['cat', 'dog', 5])
('cat', 'dog', 5)
>>> list(('cat', 'dog', 5))
['cat', 'dog', 5]
>>> list('hello')
['h', 'e', 'l', 'l', 'o']
复制代码
>>> spam = [0, 1, 2, 3, 4, 5]
>>> cheese = spam
>>> cheese[1] = 'Hello!'
>>> spam
[0, 'Hello!', 2, 3, 4, 5]
>>> cheese
[0, 'Hello!', 2, 3, 4, 5]
复制代码
看上面的代码,很是好理解,spam将引用复制给cheese,而不是复制的对象,因此对某个引用操做,都会改变那惟一的对象。若是想为cheese引用生成一个新的对象,就须要用到拷贝函数copy()和deepcopy()。其实就是java中的浅拷贝和深拷贝。
>>> import copy
>>> spam = ['A', 'B', 'C', 'D']
>>> cheese = copy.copy(spam)
>>> cheese[1] = 42
>>> spam
['A', 'B', 'C', 'D']
>>> cheese
['A', 42, 'C', 'D']
复制代码
deepcopy()深拷贝是指,不只生成一个与spam同样新的对象,连spam内部的数据也一块儿复制一堆新的对象出来。就比如说把'A','B'这种元素分别换成一个个子列表,浅拷贝不会对他们复制,而深拷贝会对这些对象进行复制。
像列表同样,“字典”是许多值的集合。但不像列表的下标,字典的索引可使用许多不一样数据类型,不仅是整数。字典的索引被称为“键”,键及其关联的值称为“键-值”对。因此能够说字典就是java中的Map。
myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
复制代码
与列表不一样的是,字典没有顺序的概念,因此不能经过操做index获取某元素,不能使用切片,不能使用排序函数。
因此操做字典,就须要另辟蹊径,使用函数keys()、values()和 items()。顾名思义,分别是获取字典的key值们,val值们,和键值对自己们。
>>> spam = {'color': 'red', 'age': 42}
>>> for v in spam.values():
print(v)
red
42
>>> for k in spam.keys():
print(k)
color
age
>>> for i in spam.items():
print(i)
('color', 'red')
('age', 42)
复制代码
值得一提的是 spam.keys()得到的是元组,若是但愿的到对应的列表就须要用list函数转化。
能够利用in 或者not in 关键字判断数据是否在字典中。
>>> spam = {'name': 'Zophie', 'age': 7}
>>> 'name' in spam.keys()
True
>>> 'Zophie' in spam.values()
True
>>> 'color' in spam.keys()
False
>>> 'color' not in spam.keys()
True
>>> 'color' in spam
False
复制代码
get()能够经过key值找到相对应的value值。get有两个参数,第一个参数是key值,第二个参数是在键值对不存在(或者说key不存在)的时候,给予的默认值。
>>> picnicItems = {'apples': 5, 'cups': 2}
>>> 'I am bringing ' + str(picnicItems.get('cups', 0)) + ' cups.'
'I am bringing 2 cups.'
>>> 'I am bringing ' + str(picnicItems.get('eggs', 0)) + ' eggs.'
'I am bringing 0 eggs.'
复制代码
setdefault()有两个参数,第一个是要插入键值对的key值,第二个是默认值。当原字典中有这个key值,就什么也不作,若是原字典中没有这个key值,就将默认值做为value,同key一块儿拼成键值对插入到字典中。
>>> spam = {'name': 'Pooka', 'age': 5}
>>> spam.setdefault('color', 'black')
'black'
>>> spam
{'color': 'black', 'age': 5, 'name': 'Pooka'}
>>> spam.setdefault('color', 'white')
'black'
>>> spam
{'color': 'black', 'age': 5, 'name': 'Pooka'}
复制代码
咱们早已经知道了字符串和其基本操做了,当咱们又学习了列表、元组、字典以后再来看一下更加丰富的处理字符串的方法。
和java同样,python也是用 \ 对特殊字符进行转义。同时,还有原始字符 r。能够在字符串开始的引号以前加上r,使它成为原始字符串。“原始字符串”彻底忽略全部的转义字符,打印出字符串中全部的倒斜杠。
>>> print(r'That is Carol\'s cat.') That is Carol\'s cat.
复制代码
python单行注释可使用特殊字符#,同时多行注释可使用""".
# 这是一行注释
""" 这是多行注释 这是多行注释 这是多行注释 """
复制代码
有时候咱们在使用print函数的时候,打印的字符串很长很长,为了页面好看,可使用'''将大字符串拆分红好几行。
print('''Dear Alice, Eve's cat has been arrested for catnapping, cat burglary, and extortion.
Sincerely,
Bob''') 复制代码
一个字符串也能够看成列表来处理,其中元素能够看做是一个个字符。因此就能够对字符串进行下标操做或者切片操做。一样的就能够利用in、not in判断某字符是否在字符串内了。
>>> spam = 'Hello world!'
>>> spam[0]
'H'
>>> spam[4]
'o'
>>> spam[-1]
'!'
>>> spam[0:5]
'Hello'
>>> spam[:5]
'Hello'
>>> spam[6:]
'world!'
复制代码
呜呼,python的基础语法就算过了一遍,固然这只是基础中的基础。像python怎么处理多线程、类的概念、内存管理等内容有时间再看吧。不忘初心,最开始学习python只是把它看成辅助语言,写写小脚本什么的,不打算研究太深,毕竟时间有限,java还有不少东西要去研究,而且,除了编程,这个世界还有不少美好的事情等待我去体验。学以至用,写爬虫也是我学习python的一个动力,写了一个小脚本爬取豆瓣电影TOP250.(好像这个是爬虫入门经典案例吧,哈哈)代码贴一下
import requests as rq
from bs4 import BeautifulSoup
import pandas as pd
def get_data(url):
print(url)
html = rq.get(url).content.decode("utf-8")
soup = BeautifulSoup(html,"lxml")
divItems = soup.find_all("div","item")
for item in divItems:
name = item.find('span',{'class':'title'}).text
rating_num = item.find('span',{'class':'rating_num'}).text
number = item.find('em').text
imgUrl = item.find("img").attrs['src']
print("----------->")
print("number:"+number)
numbers.append(number)
print("name:"+name)
names.append(name)
print("rating_num:"+rating_num)
rating_nums.append(rating_num)
print("imgUrl:"+imgUrl)
imgUrls.append(imgUrl)
print("----------->")
data_df = pd.DataFrame()
numbers = []
names = []
rating_nums = []
imgUrls = []
for num in range(0,10):
get_data("https://movie.douban.com/top250?start={}&filter=".format(int(num)*25))
data_df["序列"] = numbers
data_df["名称"] = names
data_df["评分"] = rating_nums
data_df["海报"] = imgUrls
writer = pd.ExcelWriter('movie_top250.xlsx')
data_df.to_excel(writer, 'page_1', float_format='%.5f') # float_format 控制精度
writer.save()
复制代码
固然,提早须要install的模块 requests
BeautifulSoup4
pandas
openpyxl
lxml(BeautifulSoup4 的解析器)
结束。