From e92875d96595389b4fe293adf77425efb24b9771 Mon Sep 17 00:00:00 2001 From: Hui Lan Date: Sun, 14 Apr 2019 08:44:05 +0800 Subject: added Preface and included a few questions asked by a novice programmer. --- LectureNotesOnPython.html | 166 ++++++++++++++++++++++++++-------------------- 1 file changed, 94 insertions(+), 72 deletions(-) (limited to 'LectureNotesOnPython.html') diff --git a/LectureNotesOnPython.html b/LectureNotesOnPython.html index eb0b066..b505698 100644 --- a/LectureNotesOnPython.html +++ b/LectureNotesOnPython.html @@ -370,56 +370,78 @@ ul.auto-toc { Authors: 蓝珲 (lanhui AT zjnu.edu.cn) Version: -0.1 of 2019/03/30 +0.1.1 of 2019-04-14 -

非学究写书,无空洞行文。Python语法简洁,库函数全面强大,编程速度快,运行速度也不慢。

内容目录

+
+

前言

+

非学究写书,无空洞行文。

+

Python语法简洁,库函数全面强大,编程速度快,运行速度也不慢。

+

大学里, 往往是专家教初学者。 专家也是从初学者过来的,只不过专家经常忘 +记这一点。 要知道,初学者可能只写过不到10行的程序,而专家已经写了至少 +10000行程序了。 两者的大脑构造不同。 学习是困难的, 教育或培训应把专 +家的工作流程放慢100倍! 初学者要做的是尽量快的使自己的程序量到达1000, +这包括中间无数次除错, 每次除错都是一次微小的学习。 要想感到舒服, 只 +有积累自己的经验, 无其它捷径。

+

面对新东西,初学者往往会问这些困惑 (ask the student's name):

+ +

动态的教育方式会更好。专家与初学者坐在电脑前, 逐步回答上述问题, 直到 +初学者说“我明白了”。

+
-

Python的发音纠正

+

Python的发音纠正

国人普遍把th发作s。 Not quite correct。

ˈpī-ˌthän , -thən pronounciation

-
-

Python源流

+
+

Python源流

Python之父Guido van Rossum,荷兰人,1956年生,1982年阿姆斯特丹大学获得 数学与计算机科学硕士学位。有过ABC语言的工作经验。1989年设计了Python语 言。

@@ -468,8 +490,8 @@ ul.auto-toc {
-
-

Python的关键词

+
+

Python的关键词

def pass
from import
@@ -490,8 +512,8 @@ ul.auto-toc {

关键词被语言留用(reserved),无法作变量名。

-
-

值的类型

+
+

值的类型

所有的值都是对象。a = 5, help(a) a.bit_length()

数字。1, 1.,1.1, .1, 1e1, 1e-1, 1E1, 1E-1

@@ -511,7 +533,7 @@ A list of objects

元组(tuple),字典(dict)。

-

变量(Variable)

+

变量(Variable)

是一个名字(name),是指向一个值(value)的名字。

值存放在内存(memory)中的某个地址。

尽量选有意义的简短的名字。比如,代表个数用n,代表索引用i,j,k。

@@ -600,7 +622,7 @@ A list of objects
-

可变(mutable)类型与不可变类型

+

可变(mutable)类型与不可变类型

字符串是不可变的(immutable)类型,不能在原内存地址改变。

a = 'hello' 不可以原地修改a[0] = 'H'。需要修改a的值时,需要对a进行重新赋值a = 'Hello'。

列表是可变(mutable)类型,能在原内存地址改变。

@@ -624,8 +646,8 @@ A list of objects
-
-

数与格式化显示

+
+

数与格式化显示

x = 3.1415926
@@ -673,7 +695,7 @@ A list of objects
-

字符串(Strings)

+

字符串(Strings)

由字符组成。

fruit = 'banana!'
@@ -729,7 +751,7 @@ A list of objects

以上 # [start,stop,step] 代表注释(comment),注释以 # 号开头。

-

字符串相加(concatenation)

+

字符串相加(concatenation)

输出Jack, Kack, Lack, Mack, Nack, Ouack, Pack, and Quack

prefixes = 'JKLMNOPQ'
@@ -748,7 +770,7 @@ A list of objects
-

子串(slice)

+

子串(slice)

s[n:m],其中n或m可省略。 包括第n个字符,不包括第m个字符。(索引自0开始)

@@ -771,8 +793,8 @@ A list of objects
new_greeting = 'J' + greeting[1:]
-
-

搜索字符串

+
+

搜索字符串

def find(word, c):
@@ -798,7 +820,7 @@ A list of objects

练习:用上面三参数的find来做。

-

String类(对象)方法

+

String类(对象)方法

upper()
lower()
@@ -811,14 +833,14 @@ A list of objects
-

in操作符

+

in操作符

'a' in 'banana' 'seed' in 'banana'

练习:写出下面的函数,使得 in_both('apples', 'oranges')返回'aes'。

-
-

字符串比较

+
+

字符串比较

字典序(alphabetical order)。大写字母排在小写字母前。

字符串之间可以有以下对比操作:

@@ -833,8 +855,8 @@ in_both('apples', 'oranges')返回'aes'。

计算复杂度。

即兴定义函数,制造一个长度不小于4的密码。

-
-

列表

+
+

列表

语言的内置(built-in)类型。注意与String类比,index也是从0开始, in操作符, 求长度,获得字串,遍历操作类似。

@@ -951,8 +973,8 @@ a与b是指向[1,2,3]的两个references。 因为[1,2,3]是mutable的,所以使用a对[1,2,3]做改变同样影响到b对应的值。 error-prone(易错)

-
-

列表作为参数

+
+

列表作为参数

def delete_head(t):
@@ -968,7 +990,7 @@ error-prone(易错)

-

注意区别 append+ 操作符

+

注意区别 append+ 操作符

t1 = [1, 2]
@@ -995,7 +1017,7 @@ error-prone(易错)

-

TDD - Test-driven Development

+

TDD - Test-driven Development

测试驱动开发。 My favourite。 刺激有挑战性。 帮助厘清需求。 帮助编写代码。

推荐使用pytest。如何安装? 使用命令 pip install pytest

test_cases.py 写如下测试用例。然后在命令行运行: python -m pytest test_cases.py

@@ -1034,14 +1056,14 @@ error-prone(易错)

print(pwd)
-
-

计算复杂度

+
+

计算复杂度

用Big O表述复杂度。O(n), O(n^2), O(n^3)。

密码实验回顾。

-

字典(Dictionary)

+

字典(Dictionary)

Mutable数据类型。

实际开发中超级有用。

@@ -1065,7 +1087,7 @@ error-prone(易错)

key-value pair (item)

item的顺序不可预测,不是按照创建时的顺序。

-

递增开发(Incremental Development)

+

递增开发(Incremental Development)

每次完成一小点。从易到难。

练习:给定一个字符串,数出每个字母出现的频率。

@@ -1173,7 +1195,7 @@ error-prone(易错)

练习: 改写函数 word_frequency , 使它能接受第三个参数, black_lstblack_lst 是包含要排除考虑的单词的列表。 例如, black_lst 可以是 ['the', 'and', 'of', 'to']

-

key与value互换

+

key与value互换

注意到在原来的字典中一个value可能对应多个key的值。比如 d = {'a':1, 'b':2, 'c':2} 中,2就对应两个key,'b'与'c'。

 def inverse_dictionary(d):
@@ -1210,8 +1232,8 @@ error-prone(易错)

-
-

函数

+
+

函数

函数 unique_wordsunique_words2 哪个运行速度快?

 def unique_words(lst):
@@ -1228,12 +1250,12 @@ error-prone(易错)

print(unique_words(['hello', 'world', 'am', 'he'] * N)) print(unique_words2(['hello', 'world', 'am', 'he'] * N))
-
-

局部变量

+
+

局部变量

在函数之内。函数执行结束,局部变量消失。

-
-

全局变量

+
+

全局变量

全局变量位于函数之外,模块之内。全局变量对所有模块内的函数可见(可读)。如果在函数内要对全局变量重新赋值,那么要先用 global 声明之 (declare)。

 verbose = True
@@ -1282,8 +1304,8 @@ error-prone(易错)

练习: 定义一个函数 empty_dict 清空字典 record。 要求: 不能用 return 语句。 提示: 可以用 pop 方法, 或者直接给 record 赋值 {}

-
-

调用函数与传递参数

+
+

调用函数与传递参数

在使用函数前要先确定函数已经被定义。

区别 argumentparameter 。传过去的是 argument , 函数头的参数列表是 parameterargument 的值赋给 parameterparameter 是函数的局部变量。

argumentparameter 的名字可以相同也可以不同。

@@ -1304,13 +1326,13 @@ error-prone(易错)

以上 t 一个是全局变量一个是局部变量。

-

函数执行顺序 (flow of execution)

+

函数执行顺序 (flow of execution)

函数的定义不执行,被调用时才执行。

顺序执行。 当遇到函数调用时,跳转到函数,执行函数,函数返回后继续执行跳转地后一条语句。

-
-

参考

+
+

参考

-- cgit v1.2.1