Zrocky

Stay Hungry, Stay Foolish

Think Different


欢迎与我交流

Python笔记

很早就对Python这门语言感兴趣, 终于有时间可以系统地学习, 所以才会有这篇笔记, 笔记本身基于C, OC, Swift三门语言, 相同之处没有太多赘述, 我也是一笔带过, 希望知晓! 我学习的来源主要是廖雪峰的Python教程, 本人并不是原创者, 笔记仅为本人自我记录的学习笔记

Paython开发基础

Python安装

在Mac系统中, 系统内置了Python2.7版本, 所以Mac系统用户此时已基本满足编译所需环境。但是随着Python3.x版本的普及,建议使用Python3.x版本进行开发,笔记中代码也是在Python3.x环境下编译的

使用HomeBrew安装Python3

在Terminal通过命令brew install python3安装即可

Python编译器选择

在Mac系统中可以选择Sublime Text作为Python的编译器

Python3编译说明

虽然我们使用HomeBrew安装了Python3版本,但是因为Mac内置了Python2.7,所以通用的Python命令在Mac下寻址的仍然是Python2.7,我们需要使用Python3命令来区分两种版本

运行Python代码

这里会有两种方式, 一种是讲Python代码写在.py文件中, 利用Terminal命令进行编译

  • 在终端运行.py文件
$ python3 first.py
  • 在Terminal的Python交互环境中直接书写Python命令进行编译
$ python3

在Mac或Linux系统中, 可以在代码最前面加上#!/usr/bin/env python, 系统会识别.py文件为可执行程序, Windows系统中将会忽略这一句

Paython语言基础

输入输出(I/O)

输出

使用print()函数输出,

print('Hello, World')
  • 使用'表示字符串

  • print()函数也可以接受多个字符串,使用,隔开

  • print()函数在遇到,时会输出一个空格

    >>> print('Hello', 'World')
    Hello World
    
  • print()函数也可以打印整数,或者计算结果

    >>> print(300)
    300
    >>> print(100 + 200)
    300
    
  • 混合输出数值和字符串

    >>> print('100 + 200 =', 100 + 200)
    100 + 200 = 300
    

输入

使用raw_input("输入提示语: ")让用户从键盘输入, 括号中可填入友好提醒词

name = raw_input("Please input your name: ")
print "Hello,", name

输入的字符会保存在name变量中

语法规范

注释

使用#放在解释语句前面进行注释

大小写区分

严格区分大小写, 混用会造成编译出错

数据类型

Python的数据类型与其它开发语言大致相同

整数运算得出的永远是整数

print 10 / 3

结果为3

如果需要做出精确的计算, 必须带有浮点数

print 10.0 / 3

结果为3.3333333333333335

字符串

使用'''...'''可以打印换行的文本

print '''line1
line2
line3'''

输出结果:

line1
line2
line3

布尔值

包含两个值TrueFalse(注意区分大小写)

涉及的运算符有and,not,or

# and
print True and False

输出结果: False

# or
print True or False

输出结果: True

# not
print not True

输出结果: False

空值

使用None表示空值, 但是空值并不等于0

变量

Python是一门动态变量语言,相对应的有静态变量语言, 动态语言的特点是在定义变量时可以不指定变量类型, 而静态语言则必须在定义变量时确定变量的类型

同一个变量可以反复赋值, 并且每次赋值的类型可以不同

a = 10
a = "python is fun"

针对变量的赋值操作a = "ABC", Python首先创建了一个"ABC"字符串, 然后创建了一个a变量, 并且让a指向"ABC"

常量

常量约定俗成使用全大写字母表示, 例如WIDTH

字符编码

ASCII使用一字节保存字符, 包含字母数字和一些符号

GB2312等国际语言使用两个字节保存字符

Unicode包含所有语言字符

但是Unicode的英文数字也是使用2个字节, 所以发明了可变长的编码UTF-8, 当是英文数字时, 使用一个字节, 其它字符用多个字节保存

UTF-8可变长字符编码

用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:

textCode

浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:

webCode

Python字符

ASCII与字符之间的转换

使用chr()ord()函数, 可用于字符与ASCII字符之间的互转

# 将ASCII转化为字符
chr(65)
# 将字符转化为ASCII
ord("a")

输出结果为:2

A
97

Unicode字符

使用u"..."表示Unicode字符

u'niha'

输出结果为niha

UTF-8字符

使用encode('utf-8')方法将Unicode字符转化为UTF-8字符

 u'ABC'.encode('utf-8')

输出结果: 'ABC'

使用decode('utf-8')方法将UTF-8字符转化为Unicode字符

 'ABC'.decode('utf-8')

输出结果: u'ABC'

Python中字符的实际应用

使用len()函数可以计算出字符的长度

因为Python文件本身也是也是一个文本文件, 所以在文件中使用中文时, 需要使用UTF-8编码

在文件开头添加# -*- coding: utf-8 -*-, 让编译器以UTF-8编码进行编译文件, 不然可能出现乱码

字符格式化

使用格式化字符串进行格式化输出, 格式与C语言保持一致

使用%拼接格式化的值, 值用括号包含, 以,分隔多个值

print "Hi! %s, your score is %d" % ("Michelle", 97)

输出结果:

Hi! Michelle, your scrore is 97

常用的占位符有

  • %d 整数
  • %f浮点数
  • %s字符串
  • %x十六进制整数

格式化整数和浮点数还可以指定是否补0和整数与小数的位数:

'%2d-%02d' % (3, 1)
'%.2f' % 3.1415926

输出结果:

3-01
3.14

集合类型

list类型

使用[..., ...]表示一个list, list内元素可以改变, 且元素类型可以不同

names = ["Rocky", "Shawn", "James"]
取值

获取其中一个值, 索引为负数表示从后向前获取索引

names[1]
# 倒数第一个值
names[-1]
插值

插入一个值

names.insert(1, "Henry")

在末尾拼接一个值

names.append("Harley")
删值

删除list中某个索引的值

# 删除最后一个值
names.pop()
# 删除指定索引的值
names.pop(1)
改值

修改list中的某个索引的值

names[1] = "Yuri"
排序

使用sort()进行排序

name.sort()

tuple(元组)类型

使用(..., ...)表示一个tuple, tuple内元素不可改变, 元素类型可以不同

因为tuple不可改变, 所以更加安全, 在实际使用中推荐尽量使用tuple

names = ("Rocky", "Jack", "James")

定义1个元素的tuple, 如果元素是数字, 需要使用(1,)写法

tuple也有可变的形式, 当我们把tuple内的元素定义为list时, list内元素可进行变化, 生成了一个简洁可变的tuple

t = ([1, 2], [3, 4])
t[0][1] = 11

条件判断

使用if, else, elif关键字编写条件判断语句

if a == 1:
	print "HaHa"
elif a == 2:
	print "WaWa"
else:
	print "KaKa"

循环

Python有两种循环, 一种是for...in循环, 另一种是while循环

for…in循环

for...in遍历了list里所有的元素

for name in names:
	print name

输出结果:

Rocky
Michael
Jack

在实际开发中, 经常需要遍历整数集合, Python提供了range(...)函数用来遍历整数集合

for index in range(3):
	print index

输出结果:

0
1
2
3

while循环

当满足条件时, 则不断调循环体, 当不满足条件时, 则退出循环

a = 3
while < 0:  
	a = a - 1
print a

字典集合

dict

dict是使用键值对形式的存储集合, 以{key : value}形式表示

score = {"Rocky" : 100, "Jack" : 30}

判断key是否在dict

返回True或False

"Allen" in score

返回None或者自定义的默认返回值

scroe.get("Allen", -1)
取值及赋值
print score["Rocky"]
score["Rocky"] = 99
print score["Rocky"]

输出结果:

100
99
删值
score.pop("Jack")

set

使用set([key, key])表示一个set, 创建时需传入一个list作为输入集合

set是一个元素不重复集合, 也就是说set会对所有元素进行去重

score = set([1, 2, 2, 3])
print score

输出结果: set([1, 2, 3])

添加

使用add(key)方法进行添加, 可添加重复值

score.add(5)

使用remove(key)方法进行删除

score.remove(1)
集合运算

set的数学本质是无序不重复集合, 所以两个set之间可以做交集并集运算

first = set([1, 2, 3])
second = set([2, 3, 4])
print first & second
print first | second

输出结果:

set([2, 3])
set([1, 2, 3, 4])

函数

使用抽象方法, 不关心底层实现, 专注问题本身

函数调用

Python官网可以查看Python内置的函数使用方法

Python内置函数

类型转换函数

>>> int('123')
123
>>> int(12.34)
12
>>> float('12.34')
12.34
>>> str(1.23)
'1.23'
>>> unicode(100)
u'100'
>>> bool(1)
True
>>> bool('')
False

函数别名

函数名其实是一个指向函数对象的引用, 所以可以将函数名赋值给一个变量, 相当于起别名

a = abs
a(-1)

函数定义

使用def关键字定义函数, 用return返回返回值, 如果返回空可以return None, 也可以简写为return

def rocky(a, b):
	if a > b:
		return a
	else:
		return b

print rocky(1, 2)

输出结果: 2

空函数

如果想定义一个空函数, 可以使用pass, 表示什么也不做

def rocky():
	pass

也可以使用在判断语句当中

if a > b:
	pass

参数检查

系统的函数会自动检查参数类型, 而我们自定义的则没有, 我们可以添加参数检查代码

def rocky(a, b):
	if not isinstance(a, (int)):
		raise TypeError ("bad operand type")
	if a > b:
		return a
	else:
		return b

print rocky(1, 2.1)

输出结果:

File "first.py", line 81, in <module>
    print rocky(1, 2.1)
  File "first.py", line 75, in rocky
    raise TypeError ("bad operand type")

返回值

函数可以返回多个返回值, 但Python本质上是只能返回一个返回值, 之所以能返回多个, 是因为返回值的类型为tuple

def rocky(a, b):
	return a, b

输出结果:(1, 2)

函数参数

Python中函数参数有多种实用方法, 使用默认参数、可变参数和关键字参数, 可以不同程度地简化代码

默认参数

当函数中有的值不是经常变化的, 就可以使用默认参数, 让函数调用变得简单

必选参数必须放在默认参数前面

默认参数必须指向不可变对象, 不然会出现对象不重新初始化问题

# 设置参数b默认值为2
def rocky(a, b = 2):
	return a > b
	
# 使用默认参数, 在函数调用时可以不用写可选参数部分
rocky(1)
# 当参数不是默认值时, 可以改变参数
rocky(1, 4)

当多个参数中有的使用默认, 而有的需要自定义值时, 可以指定参数名对应的参数值, 也就意味着, 可以不按顺序填写参数

def rocky(a, b, c = 1, d = 2):
	return a, b, c, d
	
rocky(3, 5, d = 2)

可变参数

使用可变参数, 可以让调用对象在定义函数时, 暂时不用管参数的个数

只需要在参数名前面添加*, 便可以创建一个可变参数, 在函数内部, 参数获得的是一个tuple

def rocky(*numbers):
	return numbers;
	
rocky(1, 2, 3, 4)

如果是一个listtuple想要调用可变参数函数, 则需要在前面添加*

numbers = [1, 2, 3, 4]
rocky(* numbers)

关键字参数

关键字参数在必选参数之外, 还可以传入一个dict, 用以扩展函数的功能

def rocky(a, b, **kw):
	return a, b, kw
	
# 直接应用key调用	
rocky(1, 3, c = 4, d = 5)

# 使用dict调用
numbers = {"c" : 3, "d" : 4}
rocky(1, 2, **numbers)

参数组合

必选参数,默认参数, 可变参数, 关键字参数可以混用, 但是参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。

def rocky(a, b = 2 , *numbers, *kw):
	return a, b, numbers, kw

函数fun(*args, **kw)可以接收任何参数

最近的文章

Ghost博客搭建

Ghost是一个现代化的,开源的,基于Node.js的博客发布平台,它的前端管理系统基于Ember.js, 后端的模板引擎采用的handlebars, 而默认数据库是MySQL,当然,你也可以使用其他类型的数据库。Ghost1.0如果用过1.0版本以前的Ghost的同学,会对Ghost版本的更新感到头疼,而一些配置问题也让人心烦。好在,就在一个月前,Ghost推出了Ghost1.0.0,并在一个月内升级到了1.6.2(到目前为止)大版本的提升,主要是因为一个东西的出现,那就是Ghost-C...…

Ghost继续阅读
更早的文章

Python爬虫

爬虫, 数据说话的时代, 具有数据收集的手段, 我觉得很重要, 因为这些数据能帮助我们更好的分析趋势, 在解决问题时提供良好的依据, 以上就是我学习爬虫的动力所在 静觅Python爬虫入门Python爬虫有一些基础库, 我们就从基础库的学习, 开始爬虫之路Urllib的使用在使用之前, 需要导入Urllib库import urllib2获取网页# 标准写法 (推荐)request = urllib2.Request("http://www.baidu.com")response = ur...…

Python继续阅读