版权声明:欢迎评论交流,转载请注明原作者。 https://blog.csdn.net/m0_37809890/article/details/86342783
前言
- 参考资料
Python教程——廖雪峰的官方网站 - 我佛了,上个教程是真的混乱,要不是我有其他语言基础,真的就被搞蒙了。
- 重新跟着廖老师走一遍
第一个Python程序
- 使用exit()退出python
- 提示符会把每一行的结果都打印出来,而直接运行整个程序则不会
- 基础输入:input(),可以传入一个字符串表示提示信息,返回值是string类型
Python基础
- 当语句以冒号结尾时,缩进的语句视为一个代码块
数据类型和变量
- 有一种特殊的空值None
字符串和编码
- ASCII编码固定一个字节。Unicode编码通常2个字节且包含了各国语言。UTF-8编码不等长,为1-6个字节,且包含了所有ASCII编码
- Python2需要考虑编码问题,最好统一为utf-8编码。Python3全部使用unicode编码,不用考虑转码问题
- 格式化输出字符串
print('%3.1f%%' % r)
dict和set
- get(p1,p2=None)方法,返回键p1的值,如果不存在,返回p2
函数
定义函数
def func_name(args):
statement
- 如果没有return语句,默认返回None
- 多返回值实际上是一个tuple
函数参数
位置参数
- 定义
def foo(x)
- 调用
foo(x)
默认参数
- 定义
def foo(a,b=2,c=3)
- 调用
foo(1); foo(1,2); foo(1,2,3)
- 可以在调用时指定参数赋值
foo(1,c=3)
- 默认参数必须指定不变对象,如None!
可变参数
- 参数名字前面加*,会把接收的元素认为是一个list或tuple,想要传递list时,在前面加*即可。
- 定义
def foo(*numbers)
- 调用
foo(1); foo(1,2,3)
- 调用
foo(*list)
关键字参数
- 关键字参数:参数名字前面加**,会把接收的参数认为是一个dict,可以扩展函数功能。用类似于定义字典的方法去传参,或者传入**dict
- 定义
def foo(a,**kw)
- 调用
foo(1)
- 调用
foo(1, a=3, b=4)
- 调用
foo(1, **dict)
命名关键字参数
- 参数必须给出名字传递,需要用*分隔位置参数与命名关键字参数
- 定义
def foo(a, *, b, c)
- 调用
foo(1,b=3,c=2)
- 调用
foo(1,c=2,b=3)
- 可以给命名关键字参数赋默认值
- 如果有一个可变参数,就不用*分隔了
参数组合
- 排列顺序:必选参数-默认参数-可变参数-命名关键字参数-关键字参数
- 如
def bar(a, c=0, *args, arg1,**kw)
- 不要瞎组合,谢谢
递归函数
栈似乎只有不到1000层
高级特性
- 用一行完成多行的事情
- range(start,stop,step)
切片
Seq[start,stop,step]
手写trim函数:
def trim(s):
st, ed, start = 0, 0, 1;
for i in range(len(s)):
if(s[i]!=' '):
ed = i+1;
if(start): st = i; start = 0;
return s[st:ed];
迭代
- 给定一个序列,用for循环来遍历它的过程称为迭代
- 检测是否可以迭代:
from collections import Iterable isinstance('abc',Iterable)
列表生成式
- 列表生成式List Comprehensions,快速方便地创建List
- 语法
[x for x in range(1,11)]
,要生成的元素放到前面,for循环放到后面。 - 后面可以带语句,前面可以带表达式,非常方便。
生成器Generator
- 不把列表元素全部提前生成,而是一边循环一边计算
- 语法与列表生成式基本相同,但外部是小括号
g=(x for x in range(1,11))
- 每次调用
next(g)
获取下一个元素 - generator可以用for迭代
- 把函数的一个调用写成生成器:写yield语句,后跟要生成的值。每次调用next时执行到yield就停止,返回这个值
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
- 通过捕获异常来获得返回值
- 生成杨辉三角形的生成器
def triangles():
lst = []
while 1:
ppt = lst + [1]
for i in range(1,len(lst)):
ppt[i] += lst[i-1]
lst = ppt
yield lst
迭代器
- 凡是可作用于for循环的对象都是Iterable类型
- 反是可作用于next()函数的对象都是Iterator类型,表示一个惰性计算的序列
- 集合等都是Iterable而不是Iterator,可以通过iter()来获得Iterator对象
- for循环本质是不断next()