list与tuple(列表与元组)
都是序列,len()获取列表元素个数,索引值都是从0开始
最后一个元素的索引是len(classmates) - 1,用-1索引可以获取最后一个元素即classmate[-1]
当索引超出了范围时,Python会报一个IndexError错误
list [yuan,su]
追加元素: __.append(‘yuan su’)
插入元素:__.insert(1, ’ yuansu ’ ) 1代表索引位置
**删除末尾元素:__pop()**可以在括号加索引位置
替换元素:classmates[1] = 'Sarah’
列表元素可以不同数据类型,元素也可以是列表,此时可以当做二维数组引用
tuple (yuan,su) 逗号才是元组的辨识符号
一旦初始化就不可更改
可以用索引值引用
t = (1,)也是元组,没有逗号就是一个整数
如果其中有一个元素是list,那么可以改变这个list中的元素,但是tuple永远指向这个list
条件判断
if 语句:条件之后要加冒号
**if _____:
__
else:
___
**
**用if , elif, 来做更细致的判断 **
input
**birth = input('birth: ')
if birth < 2000:
print(‘00前’)
else:
print(‘00后’)
**
会报错,因为输入的是字符串不能和整数比较,需要用int强制转换
s = int(input('birth: '))
循环语句
1. for __ in __可以吧list和tuple元素一个个迭代出来
range函数可以直接生成一个整数序列:list(range(0,5))
[0, 1, 2, 3, 4]
range(101)就可以生成0-100的整数序列
2. while 循环:
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
3. 循环中使用break可以提前退出循环:可以通过if来判断退出条件
4. continue的作用是提前结束本轮循环,并直接开始下一轮循环的条件判断:可以通过if来判断退出条件
Ctrl+C退出程序,或者强制结束Python进程。
dict 与set
dict 字典:使用键-值(key-value)存储,具有极快的查找速度,用大括号表示
d = {‘Michael’: 95, ‘Bob’: 75, ‘Tracy’: 85}
可以通过key放入元素: d[‘Adam’] = 67
一个key只能对应一个value,强行放入会被覆盖,key 不能重复
- **通过 元素 in 字典 **来判断key是否存在
- **dict_.get(‘key_’)**来判断key,如果key不存在,可以返回None,或者自己指定的value:d.get(‘Thomas’)
或者 d.get(‘Thomas’, -1) -1 - **dict_ .pop(‘key’)**来删除元素
- dict内部存放的顺序和key放入的顺序是没有关系的。
- 用空间来换取时间的一种方法
- dict的key必须是不可变对象,不能是变量
set 是一组key的集合,不存储value
- 要创建一个set,需要提供一个list作为输入集合:
s = set([1, 2, 3])
s
{1, 2, 3}
- 重复元素会被自动过滤
- 通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:s_.add(4)
- 通过remove(key)方法可以删除元素
- set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作,用& |
- set和dict的唯一区别仅在于没有存储对应的value
不可变对象
即不可变对象本身没有变化,只是多了一个拷贝
函数
- 内置的可以直接调用:abs(),max(),还有强制类型转换 int()等
- 可以把函数名赋给一个变量,以后函数名与变量名等价
- hex()可以把整数转化为16进制 0x400
a = 1024
b = (hex (a))
**print (b[2:])**可以从第三个字符开始显示 0x400 -> 400
定义函数
-
def 函数名 (形参):
函数体
返回值(缺省情况下返回none) -
导入自定义函数:如果你已经把my_abs()的函数定义保存为abstest.py文件了,那么,可以在该文件的当前目录下启动Python解释器,用from abstest import my_abs来导入my_abs()函数,注意abstest是文件名(不含.py扩展名)
-
空函数:用于占位,还没想好怎么写的函数
if age >= 18:
pass -
函数返回多个值:
比如在游戏中经常需要从一个点移动到另一个点,给出坐标、位移和角度,就可以计算出新的新的坐标:
import math
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
**x, y = move(100, 100, 60, math.pi / 6)**实际上返回的是一个tuple给对应的变量 -
计算平方根可以调用math.sqrt()函数:
import math
math.sqrt(2)
1.4142135623730951 -
位置参数:传入函数的参数时安慰位置先后传给多个变量
-
默认参数:def power(x, n=2): 默认n的值为2,输入时可以只输入一个值(只能放在后面 )
默认参数降低了函数调用的难度
当然也可以def power(x, 3)或者def power(x, n=2)来取代默认参数值
注意:定义默认参数要牢记一点:默认参数必须指向不变对象!
不然会出现:
add_end()
[‘END’]
但是,再次调用add_end()时,结果就不对了:
add_end()
[‘END’, ‘END’]
add_end()
[‘END’, ‘END’, ‘END’]
因为默认参数L也是一个变量,它指向对象[]。可以通过用None这个不变对象来实现没有记忆性
重要!!!
8. 可变参数:传入的参数个数可变
不用可变参数时可以一个list或tuple传进来 :
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
调用的时候,需要先组装出一个list或tuple: calc([1, 2, 3])
利用可变参数,调用函数的方式可以简化成这样:calc(1, 2, 3) 只需要在numbers前加一个*即可
** *nums**表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。
-
关键字参数:关键字参数在函数内部自动组装为一个dict
def person(name, age, ** **kw **):
print(‘name:’, name, ‘age:’, age, ‘other:’, kw)
person(‘Bob’, 35, city=‘Beijing’)
name: Bob age: 35 other: {‘city’: ‘Beijing’}
person(‘Adam’, 45, gender=‘M’, job=‘Engineer’)
name: Adam age: 45 other: {‘gender’: ‘M’, ‘job’: ‘Engineer’} -
命名关键词参数:命名关键字参数必须传入参数名
def person(name, age, * , city, job): * 是分隔符
print(name, age, city, job)
person(‘Jack’, 24, city=‘Beijing’, job=‘Engineer’)
Jack 24 Beijing Engineer
和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值 -
使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。
递归函数:函数在内部调用自身本身
阶乘:
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
函数调用是通过栈(stack)这种数据结构实现的
使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。