Python基础(一)

简介

安装

https://www.python.org/

Hello World

1
2
# hello.py
print("Hello World!");

运行

1
2
python hello.py
Hello World

输入输出

1
2
3
4
#inout.py
#print()
name = input('请输入姓名:')
print('你好,' , name , '1024*768 =', 1024 * 768 )

Python基础

代码块

当语句以冒号:结尾时,缩进的语句视为代码块

1
2
3
4
5
a = 100
if a >= 0:
print(a)
else:
print(-a)

数据类型和变量

整数

浮点

字符串

1
2
3
4
5
6
7
8
9
# 字符串转意
>>> print('I\'m ok.')
I'm ok.
>>> print('I\'m learning\nPython.')
I'm learning
Python.
>>> print('\\\n\\')
\
\

布尔值

值采用大写: True , False , 可以用and、or 和 not 运算。

空值

用 none 表示。

变量

变量名必须是大小写英文、数字和_的组合,且不能用数字开头、

常量

在Python中,通常用全部大写的变量名表示常量,

1
PI = 3.1415926535

除法运算

1
2
3
4
5
6
7
8
>>> 10 / 3
3.3333333333333335
>>> 9 / 3
3.0
>>> 10 // 3
3
>>> 10 % 3
1

字符串和编码

在最新的Python 3版本中,字符串是以Unicode编码的
对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:

1
2
3
4
5
6
7
8
9
10
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'
>>> '\u4e2d\u6587' #十六进制
'中文'

由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
Python对bytes类型的数据用带b前缀的单引号或双引号表示:

1
x = b'ABC'

1
2
3
4
5
6
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> b'ABC'.decode('ascii')
'abc'

.py 文件头部,
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

1
2
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

格式化

1
2
3
4
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
运算符 含义
%d 10进制整数
%f 浮点数
%s 字符串
%x 16进制整数

指定是否补0和整数与小数的位数

1
2
3
4
5
6
7
8
>>> '%2d-%02d' % (3, 1)
' 3-01'
>>> '%.2f' % 3.1415926
'3.14
```'
```py
>>> 'Age: %s. Gender: %s' % (25, True)
'Age: 25. Gender: True'

转意,用%%来表示一个%。

1
2
>>> 'growth rate: %.2f %%' % 7.58
'growth rate: 7.58 %'

使用list和tuple

list

1
2
3
4
5
6
7
8
9
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']
>>> len(classmates)
3
>>> classmates[0]
'Michael'
>>> classmates[-1]
'Tracy'

追加元素 append

1
2
3
>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']

添加元素 insert

1
2
3
>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']

删除元素

1
2
3
4
5
6
>>> classmates.pop() #删除末尾元素
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']
>>> classmates.pop(1)
'Jack'

tuple

另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字:

1
2
3
>>> t = (1, 2)
>>> t
(1, 2)

只有一个元素

1
2
3
>>> t = (1,)
>>> t
(1,)

混合使用

1
2
3
4
5
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

条件判断

1
2
3
4
5
6
7
8
9
#if.py
# -*- coding:utf-8 -*-
birth = int(input('birth: '))
if birth < 2000:
print('00前')
elif birth < 1990 :
print('90前')
else:
print('00后')

数据类型转换函数
int(),float(),str()

循环

1
2
3
names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name)

range 生成整数数列

1
2
>>> list(range(5))
[0, 1, 2, 3, 4]

while 用法

1
2
3
4
5
6
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)

break

1
2
3
4
5
6
7
n = 1
while n <= 100:
if n > 10: # 当n = 11时,条件满足,执行break语句
break # break语句会结束当前循环
print(n)
n = n + 1
print('END')

continue

1
2
3
4
5
6
n = 0
while n < 10:
n = n + 1
if n % 2 == 0: # 如果n是偶数,执行continue语句
continue # continue语句会直接继续下一轮循环,后续的print()语句不会执行
print(n)

使用dict和set

dict

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

1
2
3
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95

通过in判断key是否存在:

1
2
3
>>> d ={'Michael':95,'Bob':75,'Tracy':85}
>>> 'Bob' in d
true

通过get获取键值

1
2
3
>>> d.get('Thomas') #key 不存在不返回
>>> d.get('Thomas', -1) # key 不存在返回-1
-1

用pop(key) 删除

1
2
>>> d ={'Michael':95,'Bob':75,'Tracy':85}
>>> d.pop('Bob')

set

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key

1
2
3
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}

add(key) 和 remove(key)

1
2
3
4
5
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.remove(4)
>>> {1, 2, 3,}

再议不可变对象

list 可变对象

1
2
3
4
>>> a = ['c', 'b', 'a']
>>> a.sort()
>>> a
['a', 'b', 'c']

str 不可变对象

1
2
3
4
5
>>> a = 'abc'
>>> a.replace('a', 'A')
'Abc'
>>> a
'abc'

函数

定义函数

1
2
3
4
5
6
# -*- coding:utf-8 -*-
def my_abs(x):
if x >= 0:
return x
else:
return -x

如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。
return None可以简写为return。

1
2
3
4
5
6
def power(x, n):
s = 1
while n > 0:
n = n - 1
s = s * x
return s

默认参数

当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

1
2
3
4
5
6
7
8
9
# -*- coding:utf-8 -*-
def power(x,n=2):
ret = 1;
while(n>0):
ret = ret * x
n = n -1
return ret;
print(power(3))
print(power(3,3))

1
2
3
4
5
def add_end(L=None):
if L is None:
L = []
L.append('END')
return L

可变参数

1
2
3
4
5
6
7
8
9
10
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> calc(1, 2)
5
>>> calc()
0

list 和 tuple 作为参数传人

1
2
nums = [1,2,3]
cal(*nums)

关键字参数

1
2
3
4
5
6
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, city=extra['city'], job=extra['job'])
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra) #简便写法

命名关键字参数

1
2
3
4
def person(name, age, *, city, job):
print(name, age, city, job)
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:

1
2
def person(name, age, *args, city, job):
print(name, age, args, city, job)

参数组合

1
2
3
4
5
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
def f2(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)

测试

1
2
3
4
5
6
7
8
9
10
>>> f1(1, 2)
a = 1 b = 2 c = 0 args = () kw = {}
>>> f1(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> f1(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> f1(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
>>> f2(1, 2, d=99, ext=None)
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}

1
2
3
4
5
6
7
8
>>> args = (1, 2, 3, 4)
>>> kw = {'d': 99, 'x': '#'}
>>> f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}

递归函数

1
2
3
4
5
6
7
# -*- coding:utf-8 -*-
def fact(n):
if(n == 1):
return 1;
else:
return n * fact(n-1)
print(fact(3))

计算过程

1
2
3
4
5
6
7
8
9
10
===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120

fact(1000) 会报堆栈溢出错误,一般可以使用尾递归来解决,尾递归最终会被转变成循环,python 默认并不提供尾递归,开发时候可以用循环替代。
或者用其他方法实现尾递归。
一个很酷的Python尾递归优化