#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
二、在Python中,采用的格式化方式和C语言是一致的,用%
实现
%
运算符是用来格式化字符串的。在字符串内部,%s
表示用字符串替换,%d
表示用整数替换,有几个%?
占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?
,括号可以省略。
常见的占位符有:
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制整数 |
如果你不太确定应该用什么,%s
永远起作用,它会把任何数据类型转换为字符串,用%%
来表示一个%
三、
list
Python内置的一种数据类型是列表:list,用索引来访问list中每一个位置的元素,索引是从0
开始。
list = ['One','Two',Three'] , list[0]
如果要取最后一个元素,除了计算索引位置外,还可以用-1
做索引,直接获取最后一个元素。
list[-1]
使用append往list中追加元素到末尾。
list.append('Four')
也可以把元素插入到指定的位置,比如索引号为1
的位置
list.insert(1,'Five')
要删除list末尾的元素,用pop()
方法
list.pop()
要删除指定位置的元素,用pop(i)
方法
list.pop(1)
要把某个元素替换成别的元素,可以直接赋值给对应的索引位置
list[1] = 'Six'
tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改
不可变的tuple有什么意义?因为tuple不可变,所以代码更安全,跟Java变量的final定义一样。如果可能,能用tuple代替list就尽量用tuple。
tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来,所谓的“不变”是说,tuple的每个元素,指向永远不变
四、条件判断
if <条件判断1>:
<执行1>
elif <条件判断2>:
<执行2>
elif <条件判断3>:
<执行3>
else:
<执行4>
if
语句执行有个特点,它是从上往下判断,如果在某个判断上是True
,把该判断对应的语句执行后,就忽略掉剩下的elif
和else
五、循环
Python的循环有两种,一种是for...in循环。第二种循环是while循环,只要条件满足,就不断循环,条件不满足时退出循环。使用方法跟Java一样。
六、函数
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
七、递归
解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。
尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)
函数改成尾递归方式,也会导致栈溢出。