python 入门(2)

字符串还有一个编码问题。

因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),0 - 255被用来表示大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 的编码是65,小写字母 的编码是122

如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。

类似的,日文和韩文等其他语言也有这个问题。为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。

因为Python的诞生比Unicode标准发布的时间还要早,所以最早的Python只支持ASCII编码,普通的字符串'ABC'在Python内部都是ASCII编码的。

Python在后来添加了对Unicode的支持,以Unicode表示的字符串用u'...'表示,比如:

print u'中文'
中文

注意: 不加 u ,中文就不能正常显示。

Unicode字符串除了多了一个 u 之外,与普通字符串没啥区别,转义字符和多行表示法仍然有效:

转义:

u'中文\n日文\n韩文'

多行:

u'''第一行
第二行'''

raw+多行:

ur'''Python的Unicode字符串支持"中文",
"日文",
"韩文"等多种语言'''

如果中文字符串在Python环境下遇到 UnicodeDecodeError,这是因为.py文件保存的格式有问题。可以在第一行添加注释

# -*- coding: utf-8 -*-

目的是告诉Python解释器,用UTF-8编码读取源代码。然后用Notepad++ 另存为... 并选择UTF-8格式保存。

任务

用多行Unicode字符串表示下面的唐诗并打印:

静夜思

床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。

?不会了怎么办

参考代码:

print u'''静夜思
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。'''
整数,浮点数
整数与整数计算仍然是整数
整数与浮点数计算是浮点数
浮点数与浮点数计算是浮点数
为什么区分整数还是浮点数:sss
                   整数是准确的二浮点数化为二进制数可能会无线循环,如0.1,
一布尔类型
布尔类型的 and or not 计算
a=true
print a and 'a=true' and 'a=false'
结果是a=true
原因:python 把 空字符串,0,none看成false 
     其他都看成是true 
根据短路计算: a and b时 当第一个是false不管第二个怎么计算都是false,所以使用a
                        当第一个是true,那么结果取决于第二个,所以使用b
            同理a or b  第一个是true 不管第二个怎么计算都是true 使用a
                        第一个是false 那么结果取决于b 所以使用b
二 list : 很简单 就是L[]方括号  索引 L[0],L[1],L[2]从零开始 切记不要越界
也能从后开始查,如L[-1],L[-2],L[-3]
在List中加入元素,用两个方法append,insert.
append直接把元素放到L末尾
insert把元素放到L任何位置,使用insert(index,elem)

任务

注意右边编辑器代码中 list 如下:

L = ['Adam', 'Lisa', 'Paul', 'Bart']

Paul的索引是2,Bart的索引是3,如果我们要把Paul和Bart都删掉,请解释下面的代码为什么不能正确运行:

L.pop(2) L.pop(3)

怎样调整代码可以把Paul和Bart都正确删除掉?

?不会了怎么办

当首先删除索引为 2 的Paul时,L变成了:

['Adam', 'Lisa', 'Bart']

这时,注意到Bart的索引已经从原来的3变成2了!

参考代码:

L = ['Adam', 'Lisa', 'Paul', 'Bart']
L.pop(3)
L.pop(2)
print L
tuple   不能被修改,删除,添加,一旦做完就无法修改   定义用() list用【】而且必须要有  ","
tuple 在特殊情况下 可变,如('aa','dd',['dsad','dsa'])
python中if,for while  没有()只有:+四个空格缩进,注别用tab键
if中软还有其他if else  在PYTHON中药用到elif   同样要缩进4个空格
break 退出本个循环,continue 退出本次循环
dict 类似于java中的 map,同理也是集合使用函数len()可以算出其大小
可以简单地使用 d[key] 的形式来查找对应的 value,这和 list 很像,不同之处是,list 必须使用索引返回对应的元素,而dict使用key:
访问不光可以通过dict[key]的方法,还可以通过dict.get(key)如果没有这个key 返回的是none 
dict的更新直接用dict[key]更新,
set类似于java的set  无序,不重复 使用 elem in set  返回的是否是true 来判断是否有这个元素 
set的更新和list类似,set 用add(), remove()删除add()可以直接用,remove()需要判断,是否有这个序列
函数用 def +函数名+:编写, 函数可以传递多个参数,同理也可以返回多个参数,但是返回的返回值,你用print 打印出来是tuple,所以
之前你看到的多个返回值都是假象,实际上是通过tuple 返回出来的
def move(n, a, b, c):
    if n ==1:
        print a, '-->', c
        return
    move(n-1, a, c, b)
    print a, '-->', c
    move(n-1, b, a, c)
move(4, 'A', 'B', 'C')
默认的形参与JAVA不同,JAVA一般在构造中写,而 其实在引入的时候写
如def mama(age=40,sex='女')  这让我深深的怀念起了C语言~~ 猫叔一定是C出身
python 的形参是可变的 +*号 , 其实类似于JAVA将一个类或者集合传进函数
切片: 切片其实是更方便的一种遍历(python的遍历越学越方便)
list(m:n:t),m是从M开始,n是遍历n个,t每隔t个遍历一下(起始点也需要遍历)此外还可以倒序遍历如之前的list[-m],
list(-m:n:t) 从倒数M开始遍历 
set同理  
福利:字符串也可以进行切片操作
现在开始讲真正的迭代 
1. 有序集合:list,tuple,str和unicode;
2. 无序集合:set
3. 无序集合并且具有 key-value 对:dict
引索迭代 enumeranate  其实就是JAVA中的枚举,不吐槽原理:把每个elem 与一个index通过tuple绑定到一起
 
         
[(0, 'Adam'), (1, 'Lisa'), (2, 'Bart'), (3, 'Paul')]
迭代 dict中的 value 我们用老方法 需要先迭代出KEY 如今 可以新方法 values 或者 intervalues(效率高)
当要迭代出 [key,value]时候 需要 使用  items 或者 interitems
生成列表:python很神奇的地方,应该用法很方便。
print [x*(x+1) for x in range(1,100,2)] 这样便生成 一个list  等同于
 L[]
for x in range (1,100,2)
  L.append x(x+1)
 还可以添加if 判断   还可以多重循环
例子:print [a*100+b*10+c for a in range(1,10) for b in range(0,10) for c in range(1,10) if a==c]
复杂表达式

使用for循环的迭代不仅可以迭代普通的list,还可以迭代dict。

假设有如下的dict:

d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }

完全可以通过一个复杂的列表生成式把它变成一个 HTML 表格:

tds = ['%s%s' % (name, score) for name, score in d.iteritems()]
print ''
print ''
print '\n'.join(tds)
print '
NameScore
'

注:字符串可以通过 进行格式化,用指定的参数替代 %s。字符串的join()方法可以把一个 list 拼接成一个字符串。

把打印出来的结果保存为一个html文件,就可以在浏览器中看到效果了:

NameScore
Lisa85
Adam95
Bart59


你可能感兴趣的:(Python,计算机)