python笔记(3)

模块

1
2
3
4
import sys

print(sys.argv)
print(sys.path)

这里的.指的是这个模块中的变量。

1
2
from sys import argv
print(argv)

使用from import可以直接使用名称,但尽量不要如此,以避免命名冲突。

__name__

1
2
3
4
import math

print(__name__)
print(math.__name__)

这里的__name__若就是"__main__"则是独立运行的程序。

编写模块

每个.py文件都是一个模块,这非常容易。

新建一个文件myModules.py

1
2
3
4
def say():
print("Hello")

__version__ = "0.1"

运行它:

1
2
3
4
import myModules

myModules.say()
print(myModules.__version__)

使用from myModules import *会导入所有不是双下划线开头的对象。

注:尽量不要使用这样的import语句。

使用dir()可以看到所有的属性,del语句可以删除一个变量。

包可以将模块组织起来。
每个包的文件夹下要有一个__init__.py文件,子包也需要。

数据类型

下列几种较为常见:

  • Booleans
  • Numbers(Integers,Floats,Fractions,Complex Number)
  • Strings
  • Bytes
  • Lists
  • Tuples
  • Dictionaries
  • Sets

Booleans

它的值为True或是False,它依然可以被当作数值看待。(非0为真,比如空列表、元组都是假)

Numbers

它有很多种,用type()可以查询它的类型(或者是isinstance(data, class))。
整数(int)可以无限大(在python2中被用作long)。

分数有fractions模块,math中有各式各样的数学函数,但是精度有限。

Lists

List以中括号包括,逗号间隔每个元素,它是可变的,元素可以是任何东西。

向其中加入元素有多种方法,比如使用+append(x)(插入一个元素到最后),extend()(将一个列表中的所有元素插入到最后,而不是把这个列表作为一个元素),insert(i, x)(将某个元素插入到指定的位置)。

查找元素也有多个方法,比如count(x)(返回出现的次数),in()(只会返回是否在其中),index(x[, i[, j]])(返回第一次出现的位置,没有会引发异常, 返回的数k满足 $i \leq k < j$ )。

删除也有几个方式delremove()(这也可能引发异常)、pop()(这可以指定位置,同样可能引发异常),被删除后,后面的元素会填补上来,因此在其中永远不会有间隙。

reverse()可以使列表中的元素反向.

切片

不仅可以用[]访问其中的元素,可以用in表达;其中下标可以为负,表示倒数

而且可以用[]指定一个子序列(切片),它将第一个作为开始,第二个作为结束(不包含,哪怕是-1也可以):

1
2
3
4
5
6
li = [1, 2, 3, 43, 432, 23, 41, 432, 43, 31, 3213, 43]
print(li)
print(li[:])
print(li[7:])
print(li[:3])
print(li[::5])

输出:

1
2
3
4
5
[1, 2, 3, 43, 432, 23, 41, 432, 43, 31, 3213, 43]
[1, 2, 3, 43, 432, 23, 41, 432, 43, 31, 3213, 43]
[432, 43, 31, 3213, 43]
[1, 2, 3]
[1, 23, 3213]

第三个参数就是间隔数,其中,第二个数字指的是结束的数字,它不被包括。

Tuples

Tuple以小括号包括,逗号作为间隔,它是不可变的。

下标,切片(复制了另一份),查询等等不改变它本身的操作与Lists是相同的。

这两者可以通过list()tuple()互相转化。

1
2
3
4
5
6
7
8
9
10
11
12
13
nums = [1, 544, 7, 54, 42, 43]
del nums[3]

print(nums)
nums.sort()
print(nums)

nums.append("123")#由于 str 和 int 不能比较,所以不能用 sort()

print(nums)

new_nums = (1, 544, 7, 54, 42, 43)
print(new_nums)

传递Tuple

使用形如a, b的方式可以以被解释为Tuple

1
a, b = b, a

这样可以直接交换两个变量。

这种方式可以依次赋值多个变量(不仅限于两个)。

Dictionaries

Dictionary可以以形如{key: value1, key2: value2}的方式新建,它类似C++中的map

键值必须唯一,可以直接用下标访问或者新建。

items()可以返回多个Tuple方便循环访问。

Sets

set()用于实例化一个集合。

添加元素:add()(一个元素),update()(多个元素,可以是集合,列表等等)。

删除元素:discard()(不引发异常),remove()(引发异常),pop()(几乎随机的删除)。

集合操作:union()(并集),intersection()(交集),difference()(在前者而不在后者的元素的集合),symmetric_difference()(只在一个中出现的),issubset()(前者为后者子集时为真),issuperset()(前者为后者超集时为真)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
nums = set([1, 2, 3, 4, 5, 6])
print(nums)
print(1 in nums)

nums_2 = nums.copy()

nums_2.add(0)
print(nums_2)

print(nums_2.issuperset(nums))

nums_3 = set([-1, 7, 3, 6])

print(nums_3 & nums_2) #nums_2.intersection(nums_3)

引用

注:使用赋值符号只是在传递一个引用,制造副本应使用[:]

Strings

它是str类下的对象,因此可以查阅str下的多种方法。
前面介绍了format()可以用来格式化字符串。

splitlines()(将多行字符串按行截成列表,不包括换行符),lower()upper()(用于转换大小写),count()(计数字串),split()(参数指定分隔符,分离字符串为一个列表,第二个参数是分离次数(从左至右))。
index()find()count()replace()也都可以使用。

Bytes

by = b'abcd\x65'使用b定义对象,它不可变。(每个字节只能是0~255的16进制数或是ASCII编码)

bytearray()可以转为bytearray类型,它是可变的(下标访问可以改变值)。

encode()将Strings转为Bytes,相反的decode()将Bytes转为Strings。

# -*- coding: windows-1252 -*-可以在文件开头指明编码类型。

None

这是唯一的空值。