我爱编程

手把手带你入门Python

2017-12-27  本文已影响0人  付凯强

0. 序言

1. Python之禅

2. 开发者

3. 特点

4. 适用领域

5. 不适用的领域

6. Python的应用

7. 与其他语言的对比的缺点

8. 安装

9. 安装环境

10. 第一个Python程序-Hello World (初恋的感觉)

>>> print 'Hello,World!'
Hello,World!

① 设置:首选项-新建-windows-utf-8 ② 语言:python

print 'Hello,World!'  记得一定要定格左边写 保存为扩展名为py的文件

② 打印: 进入到文件所在盘符,打开命令行,然后输入python helloworld.py:

D:\>python helloworld.py
Hello,World!

11. 数据类型

  1. 整数的书写和数学一样,而且有负整数,如 0,-80
  2. 机器采用二进制,我们使用十六进制(0x开头,由0-9,a-f组成)表示整数更好,如 0x10,0xaf10
  1. 浮点数就是小号:比如1.23,2.31,而对于很大或者很小的浮点数,就必须用科学计数法表示:把10用e替代,比如1.23x10^9就是1.23e9,再比如0.000012可以写成1.2e-5。
  2. 注意:整数和浮点数在计算机中的存储方式是不同的,整数的运算永远是精确的(除法也是精确的),而浮点数在运算中会有误差。
  1. 布尔值指的是True或者False,非0就是Ture,0就是False
  2. 布尔值的运算可以通过运算符来进行:and(有false则false),or(有true则true),not(把true变为false或者false变为true)
  1. 计算十进制整数 45678 和十六进制整数 0x12fd2 之和。
  2. 请用字符串表示出Learn Python in imooc。
  3. 请计算以下表达式的布尔值(注意==表示判断是否相等):
    100 < 99
    0xff == 255
    注意:使用print命令
print 45678+0x12fd2
print "Learn Python in imooc"
print 100<99
123456
Learn Python in imooc
False

12. print语句

  1. 多个字符串可以用“,”逗号来进行连接,然后直接一起输出:
    (print 会依次打印每个字符串,遇到逗号就插入一个空格)
print 'hello','world','you','and','me'
hello world you and me
  1. 可以打印整数
print 300+500
800
  1. 注意(字符串、逗号、数学计算):
print '100+200=',100+200
100+200= 300

13. 注释

print 'hello,world' # 这是我的第一个Python程序
File "index.py", line 1
SyntaxError: Non-ASCII character '\xe8' in file index.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
# coding=utf-8
# coding=utf-8
print 'hello,world' # 这是我的第一个Python程序
# print 'hello,world'

14. 变量

x1 = 1
d = 3
x100 = x1+d
_d100 = x100
s = _d100
print s
a = 1 # a是一个整数
t_007 = 'T007' t_007是一个字符串
a = 123    # a是整数
print a
a = 'imooc'   # a变为字符串
print a

这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。
  1. 在内存中创建了一个'ABC'的字符串;
  2. 在内存中创建了一个名为a的变量,并把它指向'ABC'。

15. 小测验

a = 1
x1 = 3
a_100 = 1+x1*99
print (a_100+a)*50
14950

16. 定义字符串

"I'm OK"
'Learn "Python" in imooc'
'Bob said \"I\'m OK\".'
\n 表示换行
\t 表示一个制表符
\\ 表示 \ 字符本身

17. raw字符串与多行字符串

r'\(~_~)/ \(~_~)/'
'''Line 1
Line 2
Line 3'''
print r'''"To be, or not to be": that is the question.
Whether it's nobler in the mind to suffer.'''

18. Unicode字符串

print u'中文'
中文
u'中文\n日文\n韩文'
u'''第一行
第二行'''
ur'''Python的Unicode字符串支持"中文",
"日文",
"韩文"等多种语言'''
# -*- coding: utf-8 -*-

19. 整数和浮点数

1 + 2 + 3   # ==> 6
4 * 5 - 6   # ==> 14
7.5 / 8 + 2.1   # ==> 3.0375
(1 + 2) * 3    # ==> 9
(2.2 + 3.3) / (1.5 * (9 - 0.3))    # ==> 0.42145593869731807
1 + 2    # ==> 整数 3
1.0 + 2.0    # ==> 浮点数 3.0
1 + 2.0    # ==> 浮点数 3.0
11 % 4    # ==> 3
11.0 / 4    # ==> 2.75

20.布尔类型

True and True   # ==> True
True and False   # ==> False
False and True   # ==> False
False and False   # ==> False
True or True   # ==> True
True or False   # ==> True
False or True   # ==> True
False or False   # ==> False
not True   # ==> False
not False   # ==> True
a = True
print a and 'a=T' or 'a=F'

21. 创建list

>>> ['Michael', 'Bob', 'Tracy']
['Michael', 'Bob', 'Tracy']
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates # 打印classmates变量的内容
['Michael', 'Bob', 'Tracy']
>>> L = ['Michael', 100, True]
>>> empty_list = []

22. 按照索引访问list

>>> L = ['Adam', 'Lisa', 'Bart']
>>> print L[0]
Adam

23. 倒序访问list:

>>> L = ['Adam', 'Lisa', 'Bart']
>>> print L[-1]
Bart

24. list添加新元素:

>>> L = ['Adam', 'Lisa', 'Bart']
>>> L.append('Paul')
>>> print L
['Adam', 'Lisa', 'Bart', 'Paul']
>>> L = ['Adam', 'Lisa', 'Bart']
>>> L.insert(0, 'Paul')
>>> print L
['Paul', 'Adam', 'Lisa', 'Bart']

25. list删除元素

>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
>>> L.pop()
'Paul'
>>> print L
['Adam', 'Lisa', 'Bart']
pop()方法总是删掉list的最后一个元素,并且它还返回这个元素,所以我们执行 L.pop() 后,会打印出 'Paul'
>>> L.pop(2)
'Paul'
>>> print L
['Adam', 'Lisa', 'Bart']
L = ['Adam', 'Lisa', 'Paul', 'Bart']
Paul的索引是2,Bart的索引是3,如果我们要把Paul和Bart都删掉
L = ['Adam', 'Lisa', 'Paul', 'Bart']
L.pop(2)
L.pop(2)
print L

26. 替换元素

>>> L = ['Adam', 'Lisa', 'Bart']
>>> L[2] = 'Paul'
>>> print L
L = ['Adam', 'Lisa', 'Paul']

27. 创建tuple

>>> t = ('Adam', 'Lisa', 'Bart')

创建tuple和创建list唯一不同之处是用( )替代了[ ]

获取 tuple 元素的方式和 list 是一模一样的,我们可以正常使用 t[0],t[-1]等索引方式访问元素

28. 创建单元素tuple

>>> t = ()
>>> print t
()
>>> t = (1,)
>>> print t
(1,)

因为用()定义单元素的tuple有歧义,所以 Python 规定,单元素 tuple 要多加一个逗号“,”

29. “可变”的tuple

>>> t = ('a', 'b', ['A', 'B'])
>>> L = t[2]
>>> L[0] = 'X'
>>> L[1] = 'Y'
>>> print t
('a', 'b', ['X', 'Y'])
t = ('a', 'b', ('A', 'B'))
print t

29. if语句

age = 20
if age >= 18:
    print 'your age is', age
    print 'adult'
print 'END'
>>> age = 20
>>> if age >= 18:
...     print 'your age is', age
...     print 'adult'
...
your age is 20
adult

30. if-else

if age >= 18:
    print 'adult'
else:
    print 'teenager'

31. if-elif-else

条件1:18岁或以上:adult
条件2:6岁或以上:teenager
条件3:6岁以下:kid
if age >= 18:
    print 'adult'
elif age >= 6:
    print 'teenager'
elif age >= 3:
    print 'kid'
else:
    print 'baby'

32. for

L = ['Adam', 'Lisa', 'Bart']
for name in L:
    print name
L = [75, 92, 59, 68]
sum = 0.0
for score in L:
    sum = sum + score
print sum / 4

33. while循环

N = 10
x = 0
while x < N:
    print x
    x = x + 1
sum = 0
x = 1
while x < 100:
    sum = sum + x
    x = x + 2
print sum

34. break退出循环

sum = 0
x = 1
while True:
    sum = sum + x
    x = x + 1
    if x > 100:
        break
print sum
sum = 0
x = 1
n = 1
while True:
    sum = sum + x
    x = 2*x
    n = n+1
    if n > 20:
        break
print sum

35. continue继续循环

L = [75, 98, 59, 81, 66, 43, 69, 85]
sum = 0.0
n = 0
for x in L:
    sum = sum + x
    n = n + 1
print sum / n
for x in L:
    if x < 60:
        continue
    sum = sum + x
    n = n + 1
sum = 0
x = 1
while True:
    sum = sum + x
    x = x + 1
    if x > 100:
        break
print sum
sum = 0
x = 0
while True:
    x = x + 1
    if x > 100:
        break
    if x % 2 == 0:
        continue
    sum = sum + x
print sum

36. 多重循环

for x in ['A', 'B', 'C']:
    for y in ['1', '2', '3']:
        print x + y
A1
A2
A3
B1
B2
B3
C1
C2
C3
for x in [1,2,3,4,5,6,7,8,9 ]:
    for y in [ 0,1,2,3,4,5,6,7,8,9 ]:
        if x < y :
            print x*10+y

37. dict

d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}
>>> len(d)
3

38. 访问dict

>>> print d['Adam']
95
>>> print d['Paul']
Traceback (most recent call last):
  File "index.py", line 11, in <module>
    print d['Paul']
KeyError: 'Paul'
  1. 先判断一下 key 是否存在,用 in 操作符:
if 'Paul' in d:
    print d['Paul']
  1. 使用dict本身提供的一个 get 方法,在Key不存在的时候,返回None:
>>> print d.get('Bart')
59
>>> print d.get('Paul')
None
Adam: 95
Lisa: 85
Bart: 59
d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}
d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}
print 'Adam:',d.get('Adam')
print 'Lisa:',d.get('Lisa')
print 'Bart:',d.get('Bart')

39. dict的特点

d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}
>>> print d
{'Lisa': 85, 'Adam': 95, 'Bart': 59}
{
    '123': [1, 2, 3],  # key 是 str,value是list
    123: '123',  # key 是 int,value 是 str
    ('a', 'b'): True  # key 是 tuple,并且tuple的每个元素都是不可变对象,value是 boolean
}

40. 更新dict

d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}
>>> d['Paul'] = 72
>>> print d
{'Lisa': 85, 'Paul': 72, 'Adam': 95, 'Bart': 59}
>>> d['Bart'] = 60
>>> print d
{'Lisa': 85, 'Paul': 72, 'Adam': 95, 'Bart': 60}

41. 遍历dict

>>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
>>> for key in d:
...     print key
... 
Lisa
Adam
Bart
d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}
d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}
for key in d:
    print key,':',d.get(key)

42. set

>>> s = set(['A', 'B', 'C'])
>>> print s
set(['A', 'C', 'B'])

上述打印的形式类似 list, 但它不是 list,仔细看还可以发现,打印的顺序和原始 list 的顺序有可能是不同的,因为set内部存储的元素是无序的
>>> s = set(['A', 'B', 'C', 'C'])
>>> print s
set(['A', 'C', 'B'])
>>> len(s)
3

43. 访问set

>>> 'Bart' in s
True
>>> 'bart' in s
False

44. set的特点

  1. set的内部结构和dict很像,唯一区别是不存储value,,因此,判断一个元素是否在set中速度很快。
  2. set存储的元素和dict的key类似,必须是不变对象,因此,任何可变对象是不能放入set中的.
  3. set存储的元素也是没有顺序的.
# if 语句
x = '???' # 用户输入的字符串
if x!= 'MON' and x!= 'TUE' and x!= 'WED' ... and x!= 'SUN':
    print 'input error'
else:
    print 'input ok'
# set 集合
weekdays = set(['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'])

x = '???' # 用户输入的字符串
if x in weekdays:
    print 'input ok'
else:
    print 'input error'

45. 遍历set

>>> s = set(['Adam', 'Lisa', 'Bart'])
>>> for name in s:
...     print name
... 
Lisa
Adam
Bart
s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])
s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])
for x in s:
    print x[0]+":",x[1]

46. 更新set

  1. 增加:set的add()方法:
>>> s = set([1, 2, 3])
>>> s.add(4)
>>> print s
set([1, 2, 3, 4])
  1. 删除:set的remove()方法:
>>> s = set([1, 2, 3, 4])
>>> s.remove(4)
>>> print s
set([1, 2, 3])
  1. Care:如果删除的元素不存在set中,remove()会报错:用add()可以直接添加,而remove()前需要判断:
>>> s = set([1, 2, 3])
>>> s.remove(4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 4

47. 函数

48. 调用函数

>>> abs(100)
100
>>> abs(-20)
20
>>> abs(12.34)
12.34
>>> cmp(1, 2)
-1
>>> cmp(2, 1)
1
>>> cmp(3, 3)
0
>>> int('123')
123
>>> int(12.34)
12
>>> str(123)
'123'
>>> str(1.23)
'1.23'
L = []
x = 1
while x <= 100 :
    L.append(x*x)
    x = x + 1
print sum(L)

49. 编写函数

自定义一个求绝对值的 my_abs 函数:

def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x
def square_of_sum(L):
    sum = 0
    for num in L :
        sum = num*num +sum
    return sum 

print square_of_sum([1, 2, 3, 4, 5])
print square_of_sum([-5, 0, 5, 15, 25])

50. 函数之返回多值

import math
def move(x, y, step, angle):
    nx = x + step * math.cos(angle)
    ny = y - step * math.sin(angle)
    return nx, ny
>>> x, y = move(100, 100, 60, math.pi / 6)
>>> print x, y
151.961524227 70.0
>>> r = move(100, 100, 60, math.pi / 6)
>>> print r
(151.96152422706632, 70.0)
import math
def quadratic_equation(a, b, c):
    t = math.sqrt(b * b - 4 * a * c)
    return (-b + t) / (2 * a),( -b - t )/ (2 * a)
print quadratic_equation(2, 3, 0)
print quadratic_equation(1, -6, 5)

51. 递归函数

fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n
def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)
# -*- coding: utf-8 -*
def move(n, a, b, c):
    if n > 1:
        move(n-1,a,c,b)
        print a,'-->',c
        move(n-1,b,a,c)
    else :
        print a,'-->',c

move(4, 'A', 'B', 'C')

52. 定义默认参数

>>> int('123')
123
>>> int('123', 8)
83
# x 的 N次方
def power(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s
# 把 n 的默认值设定为 2
def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s
>>> power(5)
25
# OK:
def fn1(a, b=1, c=2):
    pass
# Error:
def fn2(a=1, b):
    pass
# 逗号如果作为连接符会生成一个空格;建议用+号连接
def greet(name = 'world'):
    print 'Hello,'+name+'.'

greet()
greet('Bart')

53. 定义可变参数

def fn(*args):
    print args
>>> fn()
()
>>> fn('a')
('a',)
>>> fn('a', 'b')
('a', 'b')
>>> fn('a', 'b', 'c')
('a', 'b', 'c')
>>> average()
0
>>> average(1, 2)
1.5
>>> average(1, 2, 2, 3, 4)
2.4
# 可变参数 args 是一个tuple,当0个参数传入时,args是一个空tuple.

def average(*args):
    sum = 0.0 
    if len(args) == 0 :
        return sum
    for x in args:
        sum = sum + x
    return sum/len(args)

print average()
print average(1, 2)
print average(1, 2, 2, 3, 4)

54. 对list进行切片

>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
>>> L[0:3]
['Adam', 'Lisa', 'Bart']

# L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素
>>> L[:3]
['Adam', 'Lisa', 'Bart']
>>> L[1:3]
['Lisa', 'Bart']
>>> L[:]
['Adam', 'Lisa', 'Bart', 'Paul']
>>> L[::2]
['Adam', 'Bart']
>>> range(1, 101)
[1, 2, 3, ..., 100]
L = range(1, 101)

print L[0:10]
print L[2:100:3]
print L[4:50:5]

55. 倒序切片

>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']

>>> L[-2:]
['Bart', 'Paul']

>>> L[:-2]
['Adam', 'Lisa']

>>> L[-3:-1]
['Lisa', 'Bart']

>>> L[-4:-1:2]
['Adam', 'Bart']
L = range(1, 101)
print L[-10:]
print L[-46::5]

56. 字符串切片

>>> 'ABCDEFG'[:3]
'ABC'
>>> 'ABCDEFG'[-3:]
'EFG'
>>> 'ABCDEFG'[::2]
'ACEG'
>>> 'abc'.upper()
'ABC'

但它会把所有字母都变成大写。请设计一个函数,它接受一个字符串,然后返回一个仅首字母变成大写的字符串。提示:利用切片操作简化字符串操作。

def firstCharUpper(s):
    return s[:1].upper()+s[1:]

print firstCharUpper('hello')
print firstCharUpper('sunday')
print firstCharUpper('september')

57. 迭代

  1. 有序集合:list,tuple,str和unicode;
  2. 无序集合:set
  3. 无序集合并且具有 key-value 对:dict
L = []
x = 1
while x > 0 :
    if x >100 :
        break
    L.append(x)
    x = x +1
for i in L:
    if i % 7==0:
        print i

58. 索引迭代

>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
>>> for index, name in enumerate(L):
...     print index, '-', name
... 
0 - Adam
1 - Lisa
2 - Bart
3 - Paul
['Adam', 'Lisa', 'Bart', 'Paul']
[(0, 'Adam'), (1, 'Lisa'), (2, 'Bart'), (3, 'Paul')]
for t in enumerate(L):
    index = t[0]
    name = t[1]
    print index, '-', name
for index, name in enumerate(L):
    print index, '-', name
>>> zip([10, 20, 30], ['A', 'B', 'C'])
[(10, 'A'), (20, 'B'), (30, 'C')]
>>> zip([10, 20, 30], ['A', 'B', 'C'])
[(10, 'A'), (20, 'B'), (30, 'C')]
L = ['Adam', 'Lisa', 'Bart', 'Paul']
for index, name in zip(range(1, len(L)+1), L):
    print index, '-', name
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
print d.values()
# [85, 95, 59]
for v in d.values():
    print v
# 85
# 95
# 59
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
print d.itervalues()
# <dictionary-valueiterator object at 0x106adbb50>
for v in d.itervalues():
    print v
# 85
# 95
# 59
  1. values() 方法实际上把一个 dict 转换成了包含 value 的list。
  2. 但是 itervalues() 方法不会转换,它会在迭代过程中依次从 dict 中取出 value,所以 itervalues() 方法比 values() 方法节省了生成 list 所需的内存。
  3. 打印 itervalues() 发现它返回一个 <dictionary-valueiterator> 对象,这说明在Python中,for 循环可作用的迭代对象远不止 list,tuple,str,unicode,dict等,任何可迭代对象都可以作用于for循环,而内部如何迭代我们通常并不用关心。
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74 }

sum = 0.0
for x in d.itervalues():
    sum = sum +x
print sum/len(d)

60. 迭代dict的key和value

>>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
>>> print d.items()
[('Lisa', 85), ('Adam', 95), ('Bart', 59)]
>>> for key, value in d.items():
...     print key, ':', value
... 
Lisa : 85
Adam : 95
Bart : 59
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 74 }

sum = 0.0
for k, v in d.iteritems():
    sum = sum + v
    print k,':',v
print 'average', ':', sum/len(d)

61. 生成列表

>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# 写列表生成式时,把要生成的元素 x * x 放到前面,后面跟 for 循环,就可以把list创建出来
print [x*(x+1) for x in range(1,101,2)]

62. 复杂表达式

d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }

可以通过一个复杂的列表生成式把它变成一个 HTML 表格:

tds = ['<tr><td>%s</td><td>%s</td></tr>' % (name, score) for name, score in d.iteritems()]
print '<table>'
print '<tr><th>Name</th><th>Score</th><tr>'
print '\n'.join(tds)
print '</table>'

# 注:字符串可以通过 % 进行格式化,用指定的参数替代 %s。字符串的join()方法可以把一个 list 拼接成一个字符串
<table border="1">
<tr><th>Name</th><th>Score</th><tr>
<tr><td>Lisa</td><td>85</td></tr>
<tr><td>Adam</td><td>95</td></tr>
<tr><td>Bart</td><td>59</td></tr>
</table>
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
def generate_tr(name, score):
    if score < 60 :
            return '<tr><td>%s</td><td style="color:red">%s</td></tr>' % (name, score)
    return '<tr><td>%s</td><td>%s</td></tr>' % (name, score)

tds = [generate_tr(name, score) for name, score in d.iteritems()]
print '<table border="1">'
print '<tr><th>Name</th><th>Score</th><tr>'
print '\n'.join(tds)
print '</table>'

63. 条件过滤

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
def toUppers(L):
    return [x.upper() for x in L if isinstance(x, str)]

print toUppers(['Hello', 'world', 101])

64. 多层表达式

L = []
for m in 'ABC':
    for n in '123':
        L.append(m + n)
>>> [m + n for m in 'ABC' for n in '123']
['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
# 百位的循环从 1-9,十位和个位的循环从 0-9

print [100 * n1 + 10 * n2 + n3 for n1 in range(1, 10) for n2 in range(10) for n3 in range(10) if n1==n3]
上一篇下一篇

猜你喜欢

热点阅读