python学习day2

时间:2023-12-20 20:32:56

一.模块初识

  python模块  

    模块让你能够有逻辑地组织你的Python代码段。

    把相关的代码分配到一个 模块里能让你的代码更好用,更易懂。

    模块也是Python对象,具有随机的名字属性用来绑定或引用。

    简单地说,模块就是一个保存了Python代码的文件。模块能定义函数,类和变量。模块里也能包含可执行的代码

    列子

    一个叫做test的模块里的python代码一般都能在一个叫做test.py的文件中找到。下例是一个简单的模块test.py。

def print_self(name):
    print(name)
    return

  import语句

    想使用Python源文件,只需在另一个源文件里执行import语句,语法如下:

import module1[,module2[,.....moduleN]  

    当解释器遇到import语句,如果模块在当前的搜索路径就会被导入。

    搜索路径是一个解释器会先进行搜索的所有目录的列表。如想要导入模块support.py,需要把命令放在脚本的顶端:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#导入模块
import test

#现在就可以用test模块里的函数了
test.print_self("Alex")

    以上实例输出结果:

Alex

    一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。

    解释器搜索模块的路径可以通过系统模块sys的path函数获取

    python学习day2

二.三元运算

  固定格式

    python学习day2

三.字节型数据

引用别人的文章,写得非常清楚,我的理解其实就是字符编码,一个encode,一个decode完了!

http://www.cnblogs.com/txw1958/archive/2012/07/19/2598885.html,这篇写的很清楚

四.列表:

  List(列表) 是 Python 中使用最频繁的数据类型。

  列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(所谓嵌套)。

  列表用[ ]标识。是python最通用的复合数据类型。看这段代码就明白。

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

list = [ 'runoob', 786 , 2.23, 'john', 70.2 ]
tinylist = [123, 'john']

print list               # 输出完整列表
print list[0]            # 输出列表的第一个元素
print list[1:3]          # 输出第二个至第三个的元素
print list[2:]           # 输出从第三个开始至列表末尾的所有元素
print tinylist * 2       # 输出列表两次
print list + tinylist    # 打印组合的列表

  以上实例输出结果:

['runoob', 786, 2.23, 'john', 70.2]
runoob
[786, 2.23]
[2.23, 'john', 70.2]
[123, 'john', 123, 'john']
['runoob', 786, 2.23, 'john', 70.2, 123, 'john']

  1.增

    列表增加有两种方法:append和insert如下实例:

a = [1, 2, 3]
print(a)
a.append(4) #在列表的最后添加一个元素
print(a)
a.insert(0, 'Alex') #在制定的位置添加一个元素
print(a)

    运行结果:

[1, 2, 3]
[1, 2, 3, 4]
['Alex', 1, 2, 3, 4]

  2.删

    列表的删除方法有del,pop,remove,clear如下实例

#!/usr/bin/env python
#-*- coding:utf8 -*-

a = [1, 2, 3, 4, 5, 'abc', 6, 7]
del a[0]#删除指定元素
print(a)
a.pop()#默认删除最后一个元素
print(a)
a.pop(0)#指定删除一个元素
print(a)
a.remove('abc')#删除值为abc的这个元素
print(a)
a.clear()#清空列表
print(a)
del a#删除变量a
print(a)

    结果:

[2, 3, 4, 5, 'abc', 6, 7]
[2, 3, 4, 5, 'abc', 6]
[3, 4, 5, 'abc', 6]
[3, 4, 5, 6]
[]
Traceback (most recent call last):
  File "E:\workspace2\studypython\day2\sys_path.py", line 17, in <module>
    print(a)
NameError: name 'a' is not defined

  3.改

    列表元素修改比较简单直接修改即可例如:

#!/usr/bin/env python
#-*- coding:utf8 -*-

a = [1, 2, 3, 4, 5, 6, 7]
a[0] = 8#修改列表中第一个值
print(a)

    运行结果:

[8, 2, 3, 4, 5, 6, 7]

  4.查

    列表可以查元素,查下标,实例:

#!/usr/bin/env python
#-*- coding:utf8 -*-

a = ['Alex', 'WTL', 'XZMLY', 'LZLL', 5, 6, 7]
print(a.index('LZLL'))#查值的下标
print(a[2])#查第三个元素的值

    运行结果:

3
XZMLY

  5.列表还包含以下函数

    1、len(list):列表元素个数

    2、max(list):返回列表元素最大值 要求列表所有元素为数值型

    3、min(list):返回列表元素最小值 要求列表所有元素为数值型

    实例:

#!/usr/bin/env python
#-*- coding:utf8 -*-

a = ['Alex', 'WTL', 'XZMLY', 'LZLL', 5, 6, 7]
b = [1.1, 2, 3, 5]
print(len(a))#列表的元素个数
print(max(b))#返回列表元素最大值条件是元素都是数值型
print(min(b))#返回列表元素最小值条件是元素都是数值型

    运行结果:

7
5
1.1

  6.其他方法

    1、list.count(obj):统计某个元素在列表中出现的次数
    2、list.extend(seq):在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
    3、list.reverse():反向列表中元素
    4、list.sort([func]):对原列表进行排序

    实例:

#!/usr/bin/env python
#-*- coding:utf8 -*-

a = ['a','l','e','x','a','c']
b = [1, 2, 3]
print(a.count('a'))#返回列表中a的出现次数
a.reverse()#翻转列表
print(a)
a.sort()#排序
print(a)
a.extend(b)
print(a)

    运行结果:

2
['c', 'a', 'x', 'e', 'l', 'a']
['a', 'a', 'c', 'e', 'l', 'x']
['a', 'a', 'c', 'e', 'l', 'x', 1, 2, 3]

 

  8.深浅copy

    这个我理解但是表述不出来,在网上copy了别人的说的很清楚这里引用过来(引用地址:http://blog.csdn.net/szchtx/article/details/22958333)

    Python中关于对象复制有三种类型的使用方式,赋值、浅拷贝与深拷贝。他们既有区别又有联系,刚好最近碰到这一类的问题,研究下。

      一、赋值

    在python中,对象的赋值就是简单的对象引用,这点和C++不同。如下:

    list_a = [1,2,3,"hello",["python","C++"]]

    list_b = list_a

    这种情况下,list_b和list_a是一样的,他们指向同一片内存,list_b不过是list_a的别名,是引用。

    我们可以使用 list_b is list_a 来判断,返回true,表明他们地址相同,内容相同。也可使用id(x) for x in list_a, list_b 来查看两个list的地址。

    赋值操作(包括对象作为参数、返回值)不会开辟新的内存空间,它只是复制了新对象的引用。也就是说,除了list_b这个名字以外,没有其它的内存开销。

    修改了list_a,就影响了list_b;同理,修改了list_b就影响了list_a。

      二、浅拷贝(shallow copy)

    浅拷贝会创建新对象,其内容是原对象的引用

    浅拷贝有三种形式:切片操作,工厂函数,copy模块中的copy函数

    比如对上述list_a,

    切片操作:list_b = list_a[:]   或者 list_b = [each for each in list_a]

    工厂函数:list_b = list(list_a)

    copy函数:list_b = copy.copy(list_a)

    浅拷贝产生的list_b不再是list_a了,使用is可以发现他们不是同一个对象,使用id查看,发现它们也不指向同一片内存。但是当我们使用 id(x) for x in list_a 和 id(x) for x in list_b 时,可以看到二者包含的元素的地址是相同的。

    在这种情况下,list_a和list_b是不同的对象,修改list_b理论上不会影响list_a。比如list_b.append([4,5])。

    但是要注意,浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,在list_a中有一个嵌套的list,如果我们修改了它,情况就不一样了。

    list_a[4].append("C")。查看list_b,你将发现list_b也发生了变化。这是因为,你修改了嵌套的list。修改外层元素,会修改它的引用,让它们指向别的位置,修改嵌套列表中的元素,列表的地址并为发生变化,指向的都是同一 个位置。

      三、深拷贝(deep copy)

    深拷贝只有一种形式,copy模块中的deepcopy函数。

    和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。因而,它的时间和空间开销要高。

    同样对list_a,若使用list_b = copy.deepcopy(list_a),再修改list_b将不会影响到list_a了。即使嵌套的列表具有更深的层次,也不会产生任何影响,因为深拷贝出来的对象根本就是一个全新的对象,不再与原来的对象有任何关联。

      四、关于拷贝操作的警告

    1、对于非容器类型,如数字,字符,以及其它“原子”类型,没有拷贝一说。产生的都是原对象的引用。

    2、如果元组变量值包含原子类型对象,即使采用了深拷贝,也只能得到浅拷贝。

    

五.元祖

  元组类似于List(列表)。

  元组用"()"标识。内部元素用逗号隔开。但是元组不能二次赋值,相当于只读列表。

  一、创建元组

  实例:

#!/usr/bin/env python
#-*- coding:utf8 -*-    

tup1 = (1, 2, 3,'a','b')#创建元祖
tup2 = (1, 2, 3)#创建元祖
tup3 = 1, 2, 3#创建元祖
tup4 = ()#创建空元祖
tup5 = (1,)#创建一个元素的元祖的时候要加个','消除歧义

print(type(tup1))
print(type(tup2))
print(type(tup3))
print(type(tup4))
print(type(tup5))

  运行结果:

<class 'tuple'>
<class 'tuple'>
<class 'tuple'>
<class 'tuple'>
<class 'tuple'>

  二、访问元组

  元组可以使用下标索引来访问元组中的值,可以进行截取如下实例:

#!/usr/bin/env python
#-*- coding:utf8 -*-    

tup1 = (1, 2, 3,'a','b')#创建元祖
tup2 = (1, 2, 3)#创建元祖
tup3 = 1, 2, 3#创建元祖
tup4 = ()#创建空元祖
tup5 = (1,)#创建一个元素的元祖的时候要加个','消除歧义

print("tup1[0]:",tup1[0])#取第一个元素
print('tup1[1:5]',tup1[1:4])#截取第二到四个元素
print('tup1[::2]',tup1[::2])#各一个截取一个元素

  运行结果

tup1[0]: 1
tup1[1:5] (2, 3, 'a')
tup1[::2] (1, 3, 'b')

  三、修改元组
  元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,如下实例:

  

#!/usr/bin/python
tup1 = (12, 34.56);
tup2 = ('abc', 'xyz');
# 以下修改元组元素操作是非法的。
# tup1[0] = 100;
# 创建一个新的元组
tup3 = tup1 + tup2;
print tup3;
#以上实例输出结果:
#(12, 34.56, 'abc', 'xyz')

  四、删除元组
  元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,如下实例:

#!/usr/bin/env python
#-*- coding:utf8 -*-    

tup1 = (1, 2, 3,'a','b')#创建元祖
del tup1
print("删除元祖之后")
print(tup1)

  运行结果:

Traceback (most recent call last):
  File "E:\workspace2\studypython\day2\sys_path.py", line 7, in <module>
删除元祖之后
    print(tup1)
NameError: name 'tup1' is not defined

  五、元组运算符
  与字符串一样,元组之间可以使用 + 号, * 号可以与整数进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。

  实例:

  

#!/usr/bin/env python
#-*- coding:utf8 -*-    

tup1 = (1, 2, 3,'a','b')#创建元祖
tup2 = (1,2)

print(tup1*2)#等于tup1+tup1
print(tup2+tup1)

  运行结果:

(1, 2, 3, 'a', 'b', 1, 2, 3, 'a', 'b')
(1, 2, 1, 2, 3, 'a', 'b')

  六、元组内置函数
  Python元组包含了以下内置函数
  1、len(tuple):计算元组元素个数。
  2、max(tuple):返回元组中元素最大值。
  3、min(tuple):返回元组中元素最小值。
  

#!/usr/bin/env python
#-*- coding:utf8 -*-    

tup1 = (1, 2, 3,'a','b')#创建元祖
tup2 = ('a','b')

print(len(tup1))#查询元祖元素个数
print(max(tup2))#找最大值
print(min(tup1))#找最小值
                #max,min函数需要比较相同相同的数据类型

  运行结果

Traceback (most recent call last):
  File "E:\workspace2\studypython\day2\sys_path.py", line 10, in <module>
    print(max(tup1))#找最小值
TypeError: unorderable types: str() > int()
5
b

  七、另一种解读

  tuple和list非常类似,但是tuple一旦初始化就不能修改,它也没有append(),insert()这样的方法,其他获取元素的方法和list是一样的。

  不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。

  在来看一个“可变的”tuple:

  

>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

  这个tuple定义的时候有3个元素,分别是'a','b'和一个list。不是说tuple一旦定义后就不可变了吗?怎么后来又变了?

  表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,

  所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,

  但指向的这个list本身是可变的!理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。

六.字典

  Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型

  一、创建字典

  字典由键和对应值成对组成。字典也被称作关联数组或哈希表。基本语法如下:

  

#!/usr/bin/env python
#-*- coding:utf8 -*-    

dict1 = {'}
dict2 = {'Alex':123}
dict3 = {'Alex':123,11.2:33}

print(type(dict1))
print(type(dict2))
print(type(dict3))

运行结果:
<class 'dict'>
<class 'dict'>
<class 'dict'>

  二、访问字典里的值

  实例:

  

#!/usr/bin/env python
#-*- coding:utf8 -*-
from test.test_pprint import dict3

dict1 = {'}
dict2 = {'Alex':123}
dict3 = {'Alex':123,11.2:33}

print('dict1["Alex"]:',dict1['Alex'])
print('dict3[11.2]:',dict3[11.2])

以上实例运行结果:

dict1["Alex"]: 123
dict3[11.2]: 33

  如果用字典里没有的键访问数据,会输出错误

  三、修改字典
  向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对如下实例:

  

#!/usr/bin/env python
#-*- coding:utf8 -*-
from test.test_pprint import dict3

dict1 = {'}

dict1['Alex'] = 250#修改已经存在的值
dict1['Jly'] = 251#添加新的键值对
print(dict1)

#以上实例输出结果
{', 'Alex': 250}

  四、删除字典元素
  能删单一的元素也能清空字典,清空只需一项操作。
  删除一个字典用del命令,如下实例:

#!/usr/bin/env python
#-*- coding:utf8 -*-
from test.test_pprint import dict3

dict1 = {'}

del dict1['Alex']#删除键是'Alex'的键值对
print(dict1)
dict1.clear()#清空
print(dict1)
del dict1#删除字典
print(dict1)#这句会报错,因为del后字典不存在了

#以上实例运行结果:

Traceback (most recent call last):
  File "E:\workspace2\studypython\day2\sys_path.py", line 12, in <module>
{'}
{}
    print(dict1)#这句会报错,因为del后字典不存在了
NameError: name 'dict1' is not defined

  五、字典键的特性
  字典值可以没有限制地取任何python对象,既可以是标准的对象,也可以是用户定义的,但键不行。
  两个重要的点需要记住:

  1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住,如下实例:

#!/usr/bin/env python
#-*- coding:utf8 -*-
from test.test_pprint import dict3

dict1 = {','Alex':250}

print(dict1)

#运行结果:
{'}

  2)键必须不可变,所以可以用数,字符串或元组充当,所以用列表就不行,如下实例:

#!/usr/bin/env python
#-*- coding:utf8 -*-
from test.test_pprint import dict3

dict1 = {(','Alex':250}

print(dict1)
dict2 = {['Alex']:250}
print(dict2)

#运行结果

{(', 'Alex': 250}
Traceback (most recent call last):
  File "E:\workspace2\studypython\day2\sys_path.py", line 8, in <module>
    dict2 = {['Alex']:250}
TypeError: unhashable type: 'list'

  六、字典内置函数&方法
    Python字典包含了以下内置函数:
    1、cmp(dict1, dict2):比较两个字典元素。(python3中没有了好像)
    2、len(dict):计算字典元素个数,即键的总数。
    3、str(dict):输出字典可打印的字符串表示。
    4、type(variable):返回输入的变量类型,如果变量是字典就返回字典类型。

    

#!/usr/bin/env python
#-*- coding:utf8 -*-
from test.test_pprint import dict3

dict1 = {','Alex':250}
print(len(dict1))#取列表长度
print(str(dict1))#不知道啥意思
print(type(dict1))

#执行结果:

3
{', 'jly': ['asdf'], 'Alex': 250}
<class 'dict'>

    Python字典包含了以下内置方法:
    1、radiansdict.clear():删除字典内所有元素
    2、radiansdict.copy():返回一个字典的浅复制
    3、radiansdict.fromkeys():创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值

    这个给个案例:

  

#!/usr/bin/python

seq = ('name', 'age', 'sex')

dict = dict.fromkeys(seq)
print "New Dictionary : %s" %  str(dict)

dict = dict.fromkeys(seq, 10)
print "New Dictionary : %s" %  str(dict)

#输出结果
New Dictionary : {'age': None, 'name': None, 'sex': None}
New Dictionary : {'age': 10, 'name': 10, 'sex': 10}

    4、radiansdict.get(key, default=None):返回指定键的值,如果值不在字典中返回default值(安全获取字典值得方法)
    5、radiansdict.has_key(key):如果键在字典dict里返回true,否则返回false
    6、radiansdict.items():以列表返回可遍历的(键, 值) 元组数组
    7、radiansdict.keys():以列表返回一个字典所有的键
    8、radiansdict.setdefault(key, default=None):和get()类似, 但如果键不已经存在于字典中,将会添加键并将值设为default
    9、radiansdict.update(dict2):把字典dict2的键/值对更新到dict里
    10、radiansdict.values():以列表返回字典中的所有值