Python安装
因为是 MAC 自带的 Python ,所以不需要安装,当然如果想安装可以参考官网安装的指南。
Python Releases for Mac OS X :
https://www.python.org/downloads/mac-osx/
使用下面的语句在 MAC 终端可以查看本机上的 Python 版本:
python -V
本节的代码都可以运行在 Anaconda 。
基本数据类型
Python3 中有常见的六种数据类型:
- Number(数字)
- String(字符串)
- List(列表)
- Tuple(元组)
- Set(集合)
- Dictionary(字典)
这六种数据类型可以分成以下两类:
- 不可变数据:Number、String、Tuple
- 可变数据:List、Dictionary、Set
Number
Python3 中支持 int、float、bool、complex。
>>> a, b, c, d = 2, 2.5, True, 2+2j
>>> print(type(a), type(b), type(c), type(d))
<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
此外还可以用 isinstance 来判断数字类型。
>>>a = 10
>>> isinstance(a, int)
True
isinstance 和 type 的区别在于:
- type() 不会认为子类是一种父类类型。
- isinstance() 会认为子类是一种父类类型。
具体对比如下:
>>> class Father:
... pass
...
>>> class Son(Father):
... pass
...
>>> isinstance(Father(), Father)
True
>>> type(Father()) == Father
True
>>> isinstance(Son(), Father)
True
>>> type(Son()) == Father
False
String
Python中的字符串用单引号 ' 或双引号 " 括起来,同时包含使用反斜杠 \ 转义特殊字符。设字符串长度为 n,索引值以 0 为开始值,一直到 以 n-1 为结束的索引值,反过来,以 -1 为从末尾的开始位置,一直到以 -(n-1) 为结束的索引值。字符串的截取的语法格式如下,不包括尾索引。
变量[头索引:尾索引]
字符串可以用 * 或者 + 进行操作,* 表示复制当前字符串,+ 表示和其他的字符串进行相连。
>>> s = 'wys'
>>> print (s) # 输出字符串
wys
>>> print (s[0:2]) # 输出第一个和第二个字符
wy
>>> print (s[1]) # 输出第二个字符
y
>>> print(s[-1]) # 输出倒数第一个字符
s
>>> print (s * 2) # 输出字符串两次
wyswys
>>> print (s + " haha") # 连接字符串
wys haha
Python 使用反斜杠( \ )转义特殊字符,如果你不想让反斜杠发生转义,可以在字符串前面添加一个 r,表示原始字符串。
>>> print('w\nys')
w
ys
>>> print(r'w\nys')
w\nys
再次要强调的是字符串是不可变的数据类型,不要试图去修改,否则会报错。
>>> s = 'wys'
>>> s[0] = 'z'
TypeError Traceback (most recent call last)
<ipython-input-474-83cdae0fbfb2> in <module>()
1 s = 'wys'
----> 2 s[0] = 'z'
TypeError: 'str' object does not support item assignment
List
列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。
列表是写在方括号 [] 之间、用逗号分隔开的元素列表。列表的索引和截取方式和 String 相同,这里不再赘述。
列表也可以通过 + 和 * 记性操作,原理和 String 类似,+ 表示连接其他的列表, * 表示重复列表内容,具体举例:
>>> l = [ 'a', 7, 2.2, [2]]
>>> l[0:2]
['a', 7]
>>> l + ['b']
['a', 7, 2.2, [2], 'b']
>>> l * 2
['a', 7, 2.2, [2], 'a', 7, 2.2, [2]]
与字符串不同的是,列表是可以改变元素的。
>>> l[0] = 'b'
>>> l
['b', 7, 2.2, [2]]
列表和字符串截取可以接收第三个参数,参数作用是截取的步长,如下举例:
>>> l[::2]
['a', 2.2]
>>> print(s[::2])
ws
>>> print(s[::-1]) # 使用此截取方式 [::-1] 相当于倒序输出结果
syw
>>> l[::-1]
[[2], 2.2, 7, 'a']
Tuple
元组( Tuple )与列表类似,不同之处在于元组的元素不能修改,否则会报错,元组写在小括号 () 里,元素之间用逗号隔开。元组中的元素类型也可以不相同。
Tuple 和 List 的操作基本相同。
>>> t = ( 'a', 6 , 2.2)
>>> print (t)
('a', 6, 2.2)
>>> t[1:]
(6, 2.2)
>>> t * 2
('a', 6, 2.2, 'a', 6, 2.2)
>>> t + ('b',) # 如果元组只有一个元素,需要加一个逗号,否则会被识别为字符串 'b',而不是 ('b')
('a', 6, 2.2, 'b')
Set
集合(set)是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。基本功能是进行成员关系测试和删除重复元素。
可以使用大括号 { } 或者 set() 函数创建集合,创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
>>> students = {'A', 'B', 'C'}
>>> print(students)
{'C', 'A', 'B'}
>>> students = {'A', 'B', 'C', 'A'}
>>> print(students)
{'C', 'A', 'B'}
>>> a = set('abab')
>>> b = set('acac')
>>> print(a)
>>> print(b)
{'a', 'b'}
{'a', 'c'}
>>> print(a - b) # a 和 b 的差集
{'b'}
>>> print(a | b) # a 和 b 的并集
{'a', 'b', 'c'}
>>> print(a & b) # a 和 b 的交集
{'a'}
>>> print(a ^ b) # a 和 b 中不同时存在的元素
{'b', 'c'}
Dictionary
列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
字典是一种映射类型,字典用 { } 标识,它是一个无序的 键 (key) : 值 (value) 的集合。
键 (key) 必须使用不可变类型。并且键 (key) 必须是唯一的。值 (value) 可以相同
>>> d = {}
>>> d['a'] = "wys"
>>> d[0] = "wys"
>>> print (d['a']) # 输出键为 'one' 的值
wys
>>> print (d[0]) # 输出键为 2 的值
wys
>>> print (d) # 输出完整的字典
{'a': 'wys', 0: 'wys'}
>>> print (keys()) # 输出所有键
dict_keys(['a', 0])
>>> print (d.values()) # 输出所有值
dict_values(['wys', 'wys'])
Python 数据类型转换常见函数
| 函数 | 介绍 |
|---|---|
| int(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) | 将一个整数转换为一个字符 |
| ord(x) | 将一个字符转换为它的整数值 |
| hex(x) | 将一个整数转换为一个十六进制字符串 |
| oct(x) | 将一个整数转换为一个八进制字符串 |
Python 控制语句
Python 的控制语句和大多数的编程语言类似,包括条件控制、循环控制等。
条件控制就是 if-else 语句,举例如下:
>>> age = 18
>>> if age < 0:
>>> print("你是在逗我吧!")
>>> elif age < 12:
>>> print("儿童")
>>> elif age < 18:
>>> print("青少年")
>>> elif age >= 18:
>>> print("成年人")
成年人
另外条件语句还可以嵌套。 循环语句主要用到 for 和 while,举例如下:
>>> for i in range(0, 10, 3) :
print(i)
0
3
6
9
>>> count = 0
>>> while count < 2:
>>> print (count, " 小于 2")
>>> count = count + 1
>>> else:
>>> print (count, " 大于或等于 2")
0 小于 2
1 小于 2
2 大于或等于 2
break 可以跳出循环体,如果从 for 或者 while 循环体中 break,任何对应的循环 else 块将不执行。
continue 语句被用来跳过当前循环块中的剩余语句,然后继续进行下一轮循环。
循环语句可以有 else 子句,它在穷尽列表(以for循环)或条件变为 false (以while循环)导致循环终止时被执行,但循环被break终止时不执行。
>>> for n in range(2, 10):
>>> for x in range(2, n):
>>> if n % x == 0:
>>> print(n, '等于', x, '*', n//x)
>>> break
>>> else:
>>> print(n, ' 是质数')
2 是质数
3 是质数
4 等于 2 * 2
5 是质数
6 等于 2 * 3
7 是质数
8 等于 2 * 4
9 等于 3 * 3
pass 语句是空语句,是为了保持程序结构的完整性。pass 不做任何事情,一般用做占位语句。
def func():
pass
函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。除了使用许多内建函数,也可以自己创建函数,这被叫做用户自定义函数。
函数的规则一般如下:
* 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
* 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
* 函数内容以冒号起始,并且缩进。
* return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
定义一个函数就是给出函数一个名称,指定了函数里包含的参数,和代码块结构。一般的格式如下:
def 函数名(参数列表):
函数体
# 计算面积的函数,参数为长和宽
>>> def area(width, height):
>>> return width * height
定义了函数之后,可以通过另一个函数调用执行,也可以直接执行。
>>> area(2,2)
4
python 函数的参数传递:
不可变类型:如整数、字符串、元组。如 fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
>>> def ChangeInt( a ):
>>> a = 10
>>> b = 2
>>> ChangeInt(b)
>>> print( b )
2
可变类型:如列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响,换句话说可变对象在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。
>>> def changeme( mylist ):
>>> mylist.append([1,2,3,4])
>>> print ("函数内取值: ", mylist)
>>> return
>>> mylist = [10,20,30]
>>> changeme( mylist )
>>> print ("函数外取值: ", mylist)
函数内取值: [10, 20, 30, [1, 2, 3, 4]]
函数外取值: [10, 20, 30, [1, 2, 3, 4]]
注意!python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
以下是调用函数时可使用的正式参数类型:
-
必需参数:必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
-
关键字参数:关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
-
默认参数:调用函数时,如果没有传递参数,则会使用函数定义时的默认参数。
-
不定长参数:可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。加了两个星号 ** 的参数会以字典的形式导入。
>>> def printinfo( arg1, *vartuple ): >>> print (arg1) >>> print (vartuple) >>> printinfo( 70, 60, 50 ) 70 (60, 50) >>> def printinfo( arg1, **vardict ): >>> print (arg1) >>> print (vardict) >>> printinfo(1, a=2,b=3) 1 {'a': 2, 'b': 3}
如果单独出现星号 * 后的参数必须用关键字传入。
>>> def f(a,b,*,c):
return a+b+c
>>> f(1,2,3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() takes 2 positional arguments but 3 were given
>>> f(1,2,c=3)
6
python 使用 lambda 来创建匿名函数。所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
-
lambda 只是一个表达式,函数体比 def 简单很多。
-
lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
-
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
-
虽然 lambda 函数看起来只能写一行,却不等同于 C 或 C++ 的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
>>> f = lambda arg1, arg2: arg1 + arg2 >>> f(1,2) 3
文件读写
在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
使用如下方法可以读文件的模式打开一个文件对象,如果文件不存在会报错,此种情况需要使用 try... finally 来解决。如果打开成功,可以用相关的方法进行读取内容到内存。
>>> f = open('/Users/wys/test.txt', 'r')
>>> f.read()
'Hello world'
最后一步是调用 close() 方法关闭文件。
>>> f.close()
使用以下方式进行写文件,和读文件类似,但是参数要变成 'w' 或者 'wb' 表示写文本文件或者写二进制文件。
>>> f = open('/Users/wys/test.txt', 'w')
>>> f.write('Hello, world!')
>>> f.close()
可以反复调用 write() 来写入文件,但是务必要调用 f.close() 来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用 close() 方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用 close() 的后果是数据可能只写了一部分到磁盘,剩下的丢失了。用with语句来得保险,因为 Python 引入了 with 语句来自动帮我们调用 close() 方法。
>>> with open('/Users/michael/test.txt', 'w') as f:
>>> f.write('Hello, world!')
要写入特定编码的文本文件,要给 open() 函数传入 encoding 参数,将字符串自动转换成指定编码。
还有很多的读写函数,请详见官网文档。
Pandas 的安装和使用
本机上的 Pandas 已经安装过了,如果安装直接执行下面的语句
>>> pip install pandas
一般 pandas 结合 numpy 使用,都可以安装到位。
在使用的时候就直接导包就可以了,如下:
>>> import pandas as pd
>>> import numpy as np
Pandas 的 Series 和 DataFrame
可以通过传入一个列表来创建 Series,如下:
>>> s = pd.Series([1, 3, 5, np.nan, 6, 8])
>>> s
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
可以通过传入一个 NumPy 数组、一组datetime 索引以及一列标签来创建一个 DataFrame 。
>>> dates = pd.date_range('20130101', periods=6)
>>> df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
>>> df
A B C D
2013-01-01 -0.993040 1.806758 0.950330 -0.600593
2013-01-02 0.609006 -0.846142 1.010976 -1.785051
2013-01-03 -1.005254 0.524503 0.254739 0.963432
2013-01-04 1.155407 -1.410927 -0.267786 -1.529697
2013-01-05 -0.072459 -0.146467 -0.998918 0.144397
2013-01-06 -0.714030 -0.349822 -0.967966 -0.565888
还可以通过传入一个字典来创造一个 DataFrame,字典中包含的对象能被转换成 Series 系列。
>>> df2 = pd.DataFrame({'A': 1.,
>>> 'B': pd.Timestamp('20130102'),
>>> 'C': pd.Series(1, index=list(range(4)), dtype='float32'),
>>> 'D': np.array([3] * 4, dtype='int32'),
>>> 'E': pd.Categorical(["test", "train", "test", "train"]),
>>> 'F': 'foo'})
A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
1 1.0 2013-01-02 1.0 3 train foo
2 1.0 2013-01-02 1.0 3 test foo
3 1.0 2013-01-02 1.0 3 train foo
具体的 Pandas 对数据的操作请看官网文档。
对描述性数据分析的 Python 实现
本部分已经用 Python 手工实现过,这里不在赘述,请跳转页面。
本文参考
菜鸟:www.runoob.com/python3/pyt…
每日格言:常常是最终一把钥匙打开了门
请作者喝果粒橙 支付宝