python学习笔记(一)---python基础
-数据类型和变量/字符串和编码
如果字符串里面有很多字符都需要转义,就需要加很多\
,为了简化,Python还允许用r''
表示''
内部的字符串默认不转义
print(r'\\\t\\')
输出结果
\\\t\\
练习:
打印出以下数值
# -*- coding: utf-8 -*- n = 123 f = 456.789 s1 = 'Hello, world' s2 = 'Hello, \'Adam\'' s3 = r'Hello, "Bart"' s4 = r'''Hello, Lisa!'''
python代码
print('n=',123) print('f=',456.789) print('s1=','\'hello,world\'') print('s2=','\'hello,\\\'Adam\\\'\'') print('s3=','r\'hello,\"Bart\"\'') print('s4=','r\'\'\'hello,\nLisa!\'\'\'')
变量
这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错如java
a='aaa' b=111 print(type(a)) print(type(b))
结果如下:
<class 'str'> <class 'int'>
常量
通常用全部大写的变量名表示常量
除法
整数的地板除//和取余%
永远是整数,即使除不尽。要做精确的除法,使用/
就可以。
由于Python的字符串类型是str
,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str
变为以字节为单位的bytes
。
格式化
%
运算符就是用来格式化字符串的。在字符串内部,%s
表示用字符串替换,%d
表示用整数替换,有几个%?
占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?
,括号可以省略。
常见的占位符有:
%d 整数、%f 浮点数、%s 字符串 在代码内表示将当前当前的数据类型转换为字符串、%x 十六进制整数
print('%2d-%02d' % (3, 1)) print('%.2f' % 3.1415926) print('Age: %s. Gender: %s' % (25, True)) print('growth rate: %d %%' % 7)
输出结果
3-01 3.14 Age: 25. Gender: True growth rate: 7 %
format()
另一种格式化字符串的方法是使用字符串的format()
方法,它会用传入的参数依次替换字符串内的占位符{0}
、{1}
……,不过这种方式写起来比%要麻烦得多:
print('Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125))
输出结果
Hello, 小明, 成绩提升了 17.1%
-List和tuple
Python内置的一种数据类型是列表:list。
一、用 【中括号】来表示 list
list是一种有序的集合,可以随时添加和删除其中的元素。
1.查询。
① 正数表示的是正向获取,负数表示的是倒着取值
classmates = ['Michael', 'Bob', 'Tracy'] print(classmates[1]) print(classmates[-1])
结果
Bob Tracy
② 查询长度
classmates = ['Michael', 'Bob', 'Tracy'] print(len(classmates))
结果
3
③ list里面的元素的数据类型也可以不同,比如:
L = ['Apple', 123, True] print(len(L)) s = ['python', 'java', ['asp', 'php'], 'scheme'] print(len(s)) p = ['asp', 'php'] s = ['python', 'java', p, 'scheme']
要拿到'php'
可以写p[1]
或者s[2][1]
,因此s
可以看成是一个二维数组,类似的还有三维、四维……数组,不过很少用到
2.添加。
classmates.append('Adam') classmates.insert(1, 'Jack')
3.删除。
classmates.pop() classmates.pop(1)
tuple
二、用 (小括号) 和逗号,
t = (1)
定义的不是tuple,是1
这个数!这是因为括号()
既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1
。
所以,只有1个元素的tuple定义时必须加一个逗号,
,来消除歧义:
t = (1,)
这个序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字:
classmates = ('Michael', 'Bob', 'Tracy')
现在,classmates这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用classmates[0]
,classmates[-1]
,但不能赋值成另外的元素。
不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
那怎么才能使其可变呢 在tuple内嵌套list 如
t = ('a', 'b', ['A', 'B']) t[2][0] = 'X' t[2][1] = 'Y'
-条件和判断
条件语句后面都要加上:冒号表示这个条件的结束,是从上往下判断,只要上面的有一个满足下面的就不会再做判断直接输出答案
age = 20 if age >= 6: print('you age is', age) print('you are a teenager') elif age >=18: print('you age is ', age) print('you are an adult') else: print('you are kids')
if
判断条件还可以简写,比如写:
x = 1 if x: print('true')
只要x
是非零数值、非空字符串、非空list等,就判断为True
,否则为False
因为input()
返回的数据类型是str
,str
不能直接和整数比较,必须先把str
转换成整数。Python提供了int()
函数来完成这件事情
否则在输入为整数时 会报以下的错误
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unorderable types: str() > int()
s = input('birth: ') birth = int(s) if birth < 2000: print('00前') else: print('00后')
但是因为强制类型转换的关系 如果你输入的是abc,原来int()
函数发现一个字符串并不是合法的数字时就会报错,程序就退出了。
会出现以下的报错信息
Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: 'abc'
-循环
一、for循环
for x in ...
循环就是把每个元素代入变量x
,然后执行缩进块的语句。
range(101)
就可以生成0-100的整数序列,计算1-100的和
sum = 0 for i in range(101): #if后要加 : 循环后面也要加 : sum = sum + i print(sum)
二、while 循环
只要条件满足,就不断循环,条件不满足时退出循环。比如我们要计算100以内所有奇数之和
sum = 0 n = 99 while n > 0: sum = sum + n n = n - 2 print(sum)
break直接跳出整个循环
continue直接跳过continue下面的所有语句,直接开始下一次循环
n = 0 while n < 10: n = n + 1 break if n % 2 == 0: # 如果n是偶数,执行continue语句 continue # continue语句会直接继续下一轮循环,后续的print()语句不会执行 print(n)
如果在这之前break 则当前什么都不会执行
- dict 和 set
一、dict
dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
用key就可以得到value的值
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} print(d['Michael'])
为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。
第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。
dict就是第二种实现方式,给定一个名字,比如'Michael'
,dict在内部就可以直接计算出Michael
对应的存放成绩的“页码”,也就是95
这个数字存放的内存地址,直接取出来,所以速度非常快。
你可以猜到,这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value。
把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} print(d['Michael']) d.pop('Bob') print(d)
结果
{'Michael': 95, 'Tracy': 85}
使用 pop (key) 删除key对应的值
请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。
这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:
可以根据in去判定 false代表这个没有在a的 dict里面
二、set
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
要创建一个set,需要提供一个list作为输入集合:
key 是 不能 重复的!!!!
增加///删除。
#set是不存储value的key的集合,不显示重复的key值,不可放入可变对象 s = set([1, 1, 2, 2, 3, 3]) s.add(4) s.remove(2) print(s) #可变对象如list a = ['c', 'b', 'a'] a.sort() print(a) #不可变对象如str b = 'abc' b.replace('a','A') print(b)
输出结果可以看出
① set内不允许重复的key
② list是可变的
③ b虽然是字符串被替换了 但是当前没有指向b这个变量 所以输出的结果不会发生改变 如果在replace的 b 前 加上b = 则实际指向的结果会变成‘Abc’