数据类型和变量
字符串:
转义字符\ ,在字符串内部包含‘’,”“时,用转义字符来标识;
\n换行
\t 制表符
\ 表示 \
简化: r”,”内部字符串默认不转义
多行:”’…”’;这个前面也可加r使用变量:
命名规则:大小写英文、数字和下划线,且不能用数字开头
动态语言:变量本身类型不固定。静态语言像java,定义变量时必须制定变量类型
变量在计算机内存中的表示:a=’abc’,内存中会创建一个abc字符串和一个名为a的变量,并将a指向abc;b = a,内存创建变量b,把b也指向变量a所指向的数据abc;a = ‘xyz’,解释器创建字符串xyz,并把a的指向改为xyz,但是b不会改;print(b)结果是?- 常量
规则:通常用全部大写的变量名来表示,eg. PI表示圆周率π
除法:第一种:“/”计算结果为浮点数;第二种:“//”地板除,结果为整数;“%”取余
字符串和字符编码
- str和bytes的互相转换
- # -- coding: utf-8 --
保证中文正常编译
格式化字符串%
- 占位符:%d 整数、%f 浮点数、%s 字符串、%x十六进制整数
- 格式:‘hello,%s’%‘world’
- 字符串中含有%—用%%表示一个%
list-列表
- numbers=[1,3,5,8,9]
len(numbers) 长度
numbers[2] 索引,从零开始
numbers.append(5) 追加元素到末尾
numbers.insert(1,0) 向索引号为1位置插入元素0
numbers.pop() 删除list末尾的元素 pop(i)删除指定位置
numbers[4] = 7 给指定索引位置赋值
tuple-元组(初始化后不能修改)
- t = (1,3)
- tuple**指向**不可变,更安全
- 陷阱:定义只有一个元素的tuple时,要加“,”,否则编译器会认为它是一个数 t = (1,)
条件判断
s = input('birth:')
birth = int(s)
if birth < 2000:
print('00前')
else:
print('00后')
- 注意if语句的格式,冒号(else后面也要有:)和缩进
- input返回的数据类型是str,要想和整数比较,必须先把str转换成整数。
循环
- for…in循环
sum = 0
for x in range(101)
sum = sum + x
print(sum)
range(x)函数:生成从0开始小于x的整数
- while循环
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
- break–提前结束循环
- continue–提前结束本轮循环,并开始下一轮循环
n = 0
while n < 10:
n = n + 1
if n%2 == 0:
continue
print(n)
#会打印出奇数
- 不要滥用break和continue语句,会造成代码执行逻辑分叉过多,容易出错。通过改写循环条件或者修改循环逻辑,去掉break和continue语句
dictionary(key-value)-字典
d = {'Join':98, 'Bob':78, 'Tracy':83}
d['Bob'] = 54 #通过key放入value,多次放入会把前面的值冲掉
d.pop('Bob') #删除key的同时,value也会被删除
#避免key不存在而报错,可以用in判断key是否存在;也可以通过dict提供的get方法,如果key不存在,返回none,或者自己制定的value
'Thomas' in d
d.get('Thomas') #返回none时交互式命令行不显示结果
d.get('Thomas', -1) #如果没有,返回-1
dict用空间换取时间,适合需要告诉查找的情况
dict特点:查找和插入速度快,不会随着key的增多而变慢;需要占用大量内存,内存浪费多。
list特点:查找和插入的时间随着元素的增加而增加;占用空间少,浪费内存少。dict的key必须是不可变对象,不能是list
set-集合
s = set([1, 2, 3]) #创建时,需要提供一个list作为输入集合
s.add(5) #添加元素
s.remove(3) #删除元素
- set是一组key的集合,但不存储value。key**不能重复**,故set中没有重复的key,重复元素自动过滤。
- set可以看成数学意义上的无序和无重复元素的集合,故可以做数学意义上的交集&、并集|
- set和dict唯一区别仅在于没有存储对应的value,同样不可放入可变对象
再议不可变对象
- 对于不可变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样就保证不可变对象本身永远是不可变的。
a = 'abc'
b = a.replace('a','A')
#a只是变量,‘abc’才是字符串对象;a指向的对象的内容才是‘abc’。replace方法没有改变字符串‘abc’的内容,相反会创建一个新的字符串‘Abc’并返回,变量a仍指向原有的字符串‘abc’,但变量b却指向新字符串‘Abc’
函数-function
- 调用函数:要知道函数名和参数(个数,type)
- 数据类型转换:int() float() str() bool()
可以把函数名赋给一个变量,相当于给这个函数取了个“别名” - 定义函数:
参数检查(isinstance()):弥补自定义函数无法识别参数类型不对问题 - 返回多个值:
可以返回多个值,但都是假象,其实返回值是一个tuple,多个变量可以同时接收一个tuple,按位置赋给对应的值
def my_abs(x):
if not isinstancee(x, (int,float)): #只允许整数和浮点数类型
raise TypeError('bad operand type') #参数检查
if x >= 0:
return x
else:
return -x
函数的参数
- 位置参数
- 默认参数–降低函数调用的难度
陷阱:默认参数必须指向不变对象 - 可变参数–单星:
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple *args
定义可变参数,只需要在参数前面加*号,调用时就可直接写
calc(1,4,4,2),calc中接收到的还是一个tuple
calc(*nums),nums是已有的list或者tuple
而不是calc((2,3,4,2))
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n*n
return sum
- 关键词参数–双星—扩展函数
允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict **kw
有扩展函数的功能,在保证能接收到必要数据的基础上,如果调用者愿意提供更多的参数,我们也能收到
def person(name, age, **kw)
print('name:', name, 'age:', age, 'other:', kw)
person('Bob', 35, city = 'Beijing') #调用
name: Bob age: 35 other: {'city': 'Beijing'} #结果
extra = {'city': 'Beijing', 'job': 'Engineer'} #先组装一个dict
person('Jack', 24, **extra) #调用
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
- 命名关键字参数—限制关键字参数且可以提供默认值
命名关键字参数必须传入参数名,否则会认为是位置函数,会报错
如果函数定义中已经有了一个可变参数,后面跟的命名关键字参数就不再需要特殊的分隔符*了
def person(name, age, * , city='Beijing', job): #*后面的参数为命名关键字参数,city有默认值
print(name, age, city, job)
person('Jack', 24, job='Engineer') #调用
Jack 24 Beijing Engineer #结果
- 参数组合
参数定义顺序必须为:必选参数、默认参数、可变参数、命名关键字参数
任意函数,都可以通过类似func(*args, **kw)的形式调用,无论它的参数是如何定义的(其中args是一个tuple,kw是一个dict)