我没学过python
,通过网上和一些图书资料,自学并且记下笔记。
很多细节留作以后自己做项目时再研究,这样能更高效一些。
python基础自学笔记
一、基本输入和输出
pthon3.0用input提示用户输入,用print提示用户输出,格式为print(“…”)
如果格式化输出,那么格式为print("%d" %(变量名))
, %d可以替换为%s等其他格式符
,以后用到什么格式自己查,这样学起来高效。
简单的例子:
1 | #-*-coding:utf-8-*- |
运行结果:
二、基本数据结构
1 列表
列表和C++里边的list差不多,插入方式为: list.insert(1,‘小草’);
1为要插入元素放在下标为1的位置,‘小草’为要插入的元素,移除元素的方式为:list.pop(3); 指定取出下标为3的元素
list中元素是按照从下标为0开始计算的。如果要计算列表中元素个数可以通过len(list)计算。
下面是个小例子:
1 |
|
试着用python 运行上面这个程序
2 tuple(元组)
tuple定义之后不可修改,理解为不可修改的列表就行了
试着运行下面这个程序,看看结果:
1 | #-*-coding:utf-8-*- |
为什么another能被修改?因为another[2]指向的是list,接着将list的第一个元素,下表为0的元素赋值为5,这是允许的。
3 dict(字典)
字典和C++map很相似,但是不完全相同,字典dict可以包含不同类型的key和value,字典的插入方式很简单d[‘韩梅梅’]=23
d为字典定义的变量名,key为‘韩梅梅’, value为23
当字典d中没有‘韩梅梅’这个key,那么就会将key和value插入d
如果调用d[‘韩梅梅’]=22,那么‘韩梅梅’对应的value就为22了
如果字典d中没有‘李磊’这个key,那么调用print(d[‘李磊’])就会提示出错。
所以取元素的时候要记得判断字典中是否有该key对应的value
可以通过get和in判断,下边代码有使用方法。
字典同样调用pop移除元素
d.pop(‘韩梅梅’)
下面这段代码综合了dict使用方式
1 | infos = {"李明":23, "豆豆":22,"老李":55} |
用python调用上边代码,看看效果。
4 set(集合)
集合中允许存在多个重复的值
集合添加元素用add,删除用remove操作
下边的代码为集合操作
1 | numset = set([1,3,5,7,9]) |
三、循环和控制
这部分和C++差不多,就是基本写法不一样
1 | nums = (0,100,34,50,179,130,27,22) |
python通过缩进和:控制模块。
四、函数
1 定义函数
1 | def judgeint(x): |
是通过def 函数名(参数):方式来定义函数。上面这个函数定义在func.py文件中,我再写一个文件使用这个函数
1 | from func import judgeint |
结果为:
可见strlist中字符串类型被函数识别并终止程序运行了。
想用到某个.py文件的函数可以用from 文件名(不包含.py) import 函数名
如果想用文件中所有的接口
from 文件名(不包含.py) import *
其他的引用方式我也不会,以后遇到了再去查。
也可以去写一个空函数
1 | #空函数 |
pass表示什么都不做。
当然函数可以返回许多值,这些值其实是通过tuple返回的
定义函数
1 | #多个返回值 |
调用这个函数
1 | from func import * |
结果为:
2 函数参数分类和使用
1 位置参数
位置参数是普通的参数
如下:
1 | def power(x): |
2 默认参数
默认参数提供了参数的默认赋值
1 | #默认参数 |
值得注意的是默认参数要指向不可变对象,否则函数重复调用默认参数会被修改
def getList(L=[]):
L.append(“end”)
return L
重复调用看看结果如何:
1 | #-*-coding:utf-8-*- |
结果
可以看出默认参数随着函数调用被修改了,所以尽量不要让默认参数指向可变对象,list就是可变对象。
3 可变参数
可变参数使用和定义都非常方便
定义:
1 | def calsum(*nums): |
使用:
1 | #-*-coding:utf-8-*- |
定义可变参数前边加*,使用时可以传入list,tuple等,实参前也加*即可。
4 关键字参数
其实和可变参数类似,关键字参数可以直接传入字典
定义:
1 | def getinfo2(name, age, **info): |
定义关键字参数在形参前边加**
使用:在实参前加**表示取出字典中所有内容依次传递给函数
1 | from func import * |
结果
5 命名关键字参数
命名关键字参数就是传入命名的关键字,如指定传入的关键字参数的key为‘city’,‘type’等等。
举例:
1 | def getinfo8(name, age, *,city, job): |
可以看出命名关键字参数格式为(*,指定名称1,指定名称2…)的格式
当命名关键字参数之前的参数为可变参数时,那么不需要*,只需指明指定的几个名成即可
格式为:(*可变参数,指定名称1,指定名称2…)
试着写个代码用一下:
1 | from func import * |
读者自己打印下,看看结果
当然命名关键字参数可以提供默认值
1 | def getinfo4(name, age,*,city='沈阳',job): |
6 参数混合使用
当参数列表包含位置参数,默认参数,可变参数,关键字参数和明明关键字参数时,
从左到右的顺序
为
位置参数
,默认参数
,可变参数
,命名关键字参数
,关键字参数
读者可以自己考虑下为什么这么规定
下面定义两个函数:
1 | def getinfo5(name,age,city='沈阳',**info): |
使用这一系列定义的函数
1 | info5 ={'性别':'男','job':'工人','兴趣':'修自行车'} |
函数调用传入实参都可以通过*arg,**dict格式,提高了开发效率
7 递归函数
递归函数和C++一样,先实现一个阶乘的函数
1 | #递归计算阶乘函数 |
print(imul2(3)) #看看结果
同样去实现汉诺塔
编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,
然后打印出把所有盘子从A借助B移动到C的方法,计算n==3时,移动方法
读者试着自己完成,我是这样实现的
1 | def move(n,A,B,C): |
调用 move(3,’A’,’B’,’C’)
结果为
用递归很简单实现了复杂的逻辑,但是递归有一个问题就是当递归次数过大容易造成栈溢出。
基础先记到这里,下一篇会记录python的特性和函数编程。