“Python-2020-fall”的版本间的差异

来自SUDA-HLT
跳到导航 跳到搜索
第525行: 第525行:
 
value = 1
 
value = 1
  
 +
例:实现reverse功能
 +
 +
例:冒泡排序(交换);选择排序;堆排序、快速排序(时间复杂度、空间复杂度)
  
 
-----
 
-----

2020年11月9日 (一) 04:49的版本

Python程序设计课程主页(2020年秋季学期)

Teacher: 李正华

Teaching Assistant: 周厚全、刘泽洋、周仕林

上课时间和地点、QQ群

   周一13:30-15:20卫校301;
   周五13:30-15:20理工楼153
   周二13:30-15:20理工楼238、247(上机);
   python-2020学习交流qq群:893402501

教材的名字:零基础学习并理解Python 特点:1)把重点放到理解上,建立基本概念;2)重视英语学习,尽可能多的给出英语术语翻译;3)多画流程图、多给出图例,考虑latex画图。

考试安排

  • 第一次考试:11.11(周三),考试内容:基础、分支、列表、循环
  • 第二次考试:12月
  • 第三次考试(期末):1月
  • 考试形式:上机考试
    • 选择题
    • 编程题:每一道题对应一个函数(给定了函数名,不能随便修改),所有函数放到一个.py文件中
      • 得至少练一次?可否开一下系统?

模拟考试

  • 考试时间:2020.11.3 13:45-15:00
  • 考试题型:5道选择题(不会没关系,快速做完)、3道编程题

Mooc混合式教学

中国大学慕课 Python程序设计 苏州大学 朱晓旭等

请同学们同步学习这个网课。

理论课上,我会留一些时间,来针对网课的内容进行讲解、答疑。

参考资料

实验课安排(有问题多主动问,Python不是教会的,而是不断动手、思考学会的)

实验报告说明

实验报告由两部分组成:

  • 实验报告:学号-exp-x.pdf (x表示第几次实验)
    • 注意文件命名格式,必须用pdf文件
    • 包含题目、流程图、解题思路、运行结果截图、遇到什么问题及如何解决的、总结有哪些收获、对老师的建议
    • 每次会提供一个基本的实验模板,学生按照自己的方式去安排报告的内容
    • 每一个题目,必须先画流程图,然后写代码。可以手画流程图然后拍照,也可以用画图软件去画。
  • 代码:学号-exp-x.py
    • 把所有题目的代码放到一个py文件中,不要压缩,在提交的时候点击附件,上传相应实验的.py文件。
    • 注意可读性,方便老师批改,可以写一些必须的注释

注意事项:

  • 抄袭会严惩!当次实验成绩清0!
  • 实验报告、代码,要保留好,不要删除,期末的时候可能要统一放到一个文件夹中,交给老师。
  • 除了基本的题目,还可以额外做老师在课堂上提出的思考题、扩展题。
  • 根据认真程度、完成的质量、可读性等,来综合评分
  • 每次作业批改后,会在理论课或上机课上进行讲解,重点是讲大家常见的错误。

往年的习题集:

扩展题目(选做,可以放到实验报告中)


顺序结构题目:
1)输入三个变量的值,然后按小到大顺序输出。
2)BMI指数(身体质量指数,Body Mass Index)是目前国际上常用的衡量人体胖瘦程度及是否健康的一个标准。
体质指数(BMI)=体重(kg)÷身高^2(m)
3)编写程序实现华氏温度到摄氏转换
    转换公式:
摄氏度C=(华氏度-32)乘以(5/9)
华氏度F=32+(9/5) 乘以 摄氏度C
4)从键盘输入一个三位整数n,输出其逆序数m。例如,输入n=127,则m=721。

-----
分支结构题目:
(1)判断年份year是否为闰年。
(2)判断ch是否为小写字母。
(3)判断m能否被n整除。
(4)判断ch既不是字母也不是数字字符。
(5)输入年月,求该月的天数。
(6)输入一个时间(小时:分钟:秒),输出该时间经过5分30秒后的时间
(7)根据bmi情况,输出不同的信息:
if bmi<18.5:
    print("过轻")
elif bmi<25:
    print("正常")
elif bmi<28:
    print("过重")
elif bmi<32:
    print("肥胖")
else:
    print("非常肥胖")

-----
循环结构题目:
  从m到n数字求和
  判断一个数字是否为素数(质数)
  判断一个字符串是否为回文('abccba', 'aba')
  求一个浮点数(>0)的根号,可以有多种方法。例如:平方根迭代公式x1=1/2*(x0+a/x0)
  求两个整数a与b的最大公约数、最小公倍数
  输出[100,1000)以内的全部完数(因子之的和等于自己,如6=1+2+3)
  用字符'*'输出不同的形状,如等边三角形,等腰三角形,直角三角形
  打印9*9乘法表
  
角谷猜想:
是指对于任意一个正整数
如果是奇数,则乘3加1
如果是偶数,则除以2
得到的结果再按照上述规则重复处理
最终总能够得到1

欧几里得算法(辗转相除法)求最大公约数
num1,num2=eval(input("请输入两个正整数"))
if num1<num2:
    num1,num2=num2,num1 #保证num1大
while num1%num2!=0:
    temp=num1%num2
    num1=num2
    num2=temp
print("最大公约数是:",num2)

哥德巴赫猜想
哥德巴赫->欧拉
任一大于2的偶数都可表示为两个素数之和
1+1
陈景润
任何一个充分大的偶数都可以表示成一个素数和一个不超过两个素数的乘积之和
1+2

猜数字
计算机产生一个1-10000之间的随机数
人去猜
计算机提示
偏大
偏小
猜对
显示猜的人所猜的次数

  • 2020.10.26:输出当前时间,新输出的时间刷新旧时间。(提示,利用退格符,PyCharm可以,用cmd也可以,IDLE不行)
  • 2020.10.23:求平方根,是否还有其他更快的解法(之前讲的是二分查找)
  • 2020.10.15:把求平方根的代码,扩展为x为任何大于0的浮点数。注意一定要先画流程图。

思考题目

  • 有100只一模一样的苹果,编号1-100。其中99个是正常的,一个被注射了毒药。只要老鼠咬一口毒苹果,一天后则死亡。现在,你有7只老鼠和一天的时间,如何检验出哪个号码的苹果被注射了毒药?
  • 蒙特卡洛法求圆周率 pi。正方形面积、圆的面积。当然,圆的面积公式又是怎么来的呢?

实验课常见问题

2020.10.20:

  • input()函数从用户得到的输入类型是字符串,不能直接进行数值的运算,需要类型转换。
  • 希望一次性input多个数字,可以用字符串split方法:
    • lst = list(map(int, input('please input:').split())) #一次性输入多个数字,按空格隔开;并存储到一个列表中
    • x, y, z = eval(input('please input two int, using comma as the delimiter: ')) # 输入 3, 5, -4
    • lst = eval(input('please input a python list: ')) # 输入 [3, 5, -4],中括号必须有,作为列表对象存储
    • a_tuple = eval(input('please input several int, using comma as the delimiter: ')) # 输入 3, 5, -4,作为元组对象存储
  • 注意变量 x 与字符串 "x" 之间的区别。

第一次实验报告 2020.10.20

  • 截止时间:11月4日20:00前
  • 报告模板(含基本题目),见csteaching

第二次实验报告 2020.11.3

第三次实验报告 2020.11.10

  • 截止时间:

讲给同学们的话

大学生活、学习的一些建议

  • 计算机英语很重要(1000左右单词),有助于理解和记忆;
  • 逻辑思维能力很重要,从流程图(或伪代码)锻炼起;
  • 多动手、多练习、多思考、多尝试,才能学好编程;
  • 编程只是计算机科学与技术这门学科的最基本能力。要想成为顶尖的编程高手,必须对计算机的硬件、操作系统、数据结构、算法等基础理论理解透彻,所以要长期坚持,不断提高自己的计算机素养和基础。
2020.10.23 今天又少了一次课(第5周周五少了一次)。希望大家利用各种资源,抓紧学习。我的课主要以理解为主,把知识串起来。要学好python,要不断写代码、调试。要靠自己


讲义记录

TODO

 


 选择 -> 列表 -> 循环 -> 元组 -> 字符串切片、方法等(讲课顺序)


-----


random模块的学习和使用

什么是模块?py文件,文件夹组织时,如何import?【后期还会专门学习一下】

help(dir)

dir(math)

help(random)

dir(random)

help(time)

dir(time)

help(time.ctime)


Python默认安装仅包含部分基本或核心模块,但用户可以安装大量的扩展模块,pip是管理模块的重要工具。
在Python启动时,仅加载了很少的一部分模块,在需要时由程序员显式地加载(可能需要先安装)其他模块。
减小运行的压力,仅加载真正需要的模块和功能,且具有很强的可扩展性。
可以使用sys.modules.items()显示所有预加载模块的相关信息。



import 模块名
>>>import math
>>>math.sin(0.5)               #求0.5的正弦
>>>import random
>>>x=random.random( )    #获得[0,1) 内的随机小数
>>>y=random.random( )
>>>n=random.randint(1,100) #获得[1,100]上的随机整数
可以使用dir函数查看任意模块中所有的对象列表,如果调用不带参数的dir()函数,则返回当前脚本的所有名字列表。
可以使用help函数查看任意模块或函数的使用帮助。


from 模块名 import 对象名[ as 别名] #可以减少查询次数,提高执行速度
from math import *    #谨慎使用
>>> from math import sin
>>> sin(3)
0.1411200080598672
>>> from math import sin as f #别名
>>> f(3)
0.141120008059867


-----

列表:
可变对象
for + remove操作的问题
切片
排序
for遍历、while遍历
append 
extend

列表delete del (下标while循环,下标,for in range有问题的)
remove删除first occurrence,找不到会抛出异常

----- 


字符串格式化(formating operator)

以某种格式将n个相同类型或不同类型的对象转化为一个字符串
讲一下基本的即可。
'%d' % 3  # '3'  
'%d %d --- %d' % (3, 4, -7)  # '3 4 --- -7'
'%d %d --- %d' % (0xff, 0o33, 0b011110)   # '377 27 --- 30'
'%8d %5d --- %10d' % (0xff, 0o33, 0b011110)   # 默认右对齐
'%-8d %-5d --- %-10d' % (0xff, 0O33, 0b011110)   # 左对齐
‘%f’ % 9.9   # 输出浮点数‘9.900000’
‘%10f\n%10f\n%10f’ % (9.9, 12.754, 3.34)
‘%6.3f\n%6.3f\n%6.3f’ % (9.9, 12.754, 3.34)   # 占6个字节,小数点后保留3位
‘%10s’ % 'hi'   

浮点数指数形式:即用科学计数法表示的浮点数,例如:  	45e-5、		9.34e2,格式化怎么做?

花括号形式的,runoob

-----

二进制、八进制、十六进制、十进制,放到一起讲
1. 字符ascii码转化
ord('a')  # 字符对应的ASCII码(American standard code for information interchange)
chr(97) # 返回与ASCII码对应的字符


2. 字符串中字符表示
print('\x21') 十六进制
print('\41') == print('\041') 八进制
十进制怎么写呢?

3. 字符串格式化中的 %x %o等
'%o %x --- %d' % (0xff, 0O33, 0b011110)    # '377 1b --- 30'
'0x%x' % 255        # '0xff'

4. print(0x21) == print(0o41) == print(33) 整数
整数进制转换
hex(1) # 十六进制
bin(255) # 二进制
补码存储(高级部分,要不要将呢)
位运算(二进制、十六进制等时再具体讲)

-----

字符串方法(方法成员)
'\b' * 5
'abc'.center(10)  # 占10个字节,居中
'abc'.isalpha()   # 字符串中所有字符是否都是字母,返回布尔值
'   abc  \t\n'.strip()  # 去除空白符
'##abc'.strip('#')  # 去除指定符号
'abc'.replace('ab','AB')  # 替换
'a b c'.split()  # 切分字符串

http://www.asciitable.com/ ascii码表

raw字符串,可以等正则表达式的时候讲?

-----
程序注释
#
'''
'''
-----

函数要早点讲,考试要用到,只讲基本的即可




成员操作符membership【列表之后讲】
'abc' in 'abcdefg'
'ac' not in 'adf'
s = 'abcdef' # 下标s[1]='b',s[-1]='e'
#切片操作,前闭后开
s[3:5] # 'de'
s[3:] # 'def'
s[:3] # 'abc'
s[1:5:2] # 'bd',步长为2
s[-5:-2] # 'bcd'
s[::2] # 'ace'
s[::-1] # 'fedcba'
s[-2,-5,-2] # 'ec'


标量Scalar(integer, floating-point number, boolean)
矢量Non-Scalar(字符串string等)


python的特点
high-level(python > c++ > c > 汇编)
   C语言能做的,Python都能做?感觉不一定
解释性(interpretative)
面向对象(object)
跨平台、移植性高
2.0和3.0不兼容,语法有一些小的变化

学习朱晓旭老师的PPT

 

in和not in 测试(成员测试,列表、字符串等)

isinstance(3, int)
用单引号或双引号括起来的字符串不可跨行
用三引号括起来的字符串可以是多行的

格式字符串:% format() str.format()


同步赋值的一般形式为:
变量1,变量2,……,变量n=表达式1,表达式2,……,表达式n
左边变量的个数与右边表达式的个数要一致
首先计算右边n个表达式的值
然后同时将表达式的值赋值给左边的n个变量
例如:
>>> a,b,c=10,20,30
交换两个变量的值
x, y = y, x (讲到元组的时候提一下?)

原始字符串:如果不希望字符串转义,前面加r
r”\n”

如果转义后没有意义,那么就是两个字符,如'\A'

转义字符:以反斜杠“\”开头,后跟一个或多个字符(反斜杠称为转义字符,表示的字符称为特殊字符?怎么说比较清晰呢,得看看英文文献,确认一下?)

转义字符具有特定的含义
  不同于字符原有的意义,故称转义字符,
  主要用来表示那些用一般字符不便于表示的控制代码

eval()函数
其调用格式为:  
eval(字符串)
作用是把字符串的内容作为对应的Python语句(表达式?)来执行


逗号:分隔符(元组)

表达式:
单个任何类型的对象或常数
使用运算符连接的变量和常量
函数调用的任意组合

什么是表达式?eval('x=3') vs. x=eval('3')

dir(__builtins__)

可以使用sys.modules.items()显示所有预加载模块的相关信息。


Python代码规范(摘自朱晓旭老师PPT)

缩进:
    类定义、函数定义、选择结构、循环结构,行尾的冒号表示缩进的开始
    python程序是依靠代码块的缩进来体现代码之间的逻辑关系的,缩进结束就表示一个代码块结束了。
    同一个级别的代码块的缩进量必须相同。
    一般而言,以4个空格为基本缩进单位,可以通过下面的方法进行代码块的缩进和反缩进:

注释:
    一个好的、可读性强的程序一般包含30%以上的注释。常用的注释方式主要有两种:
        以#开始,表示本行#之后的内容为注释
        包含在一对三引号'''...'''或"""..."""之间且不属于任何语句的内容将被解释器认为是注释

每个import只导入一个模块

如果一行语句太长,可以在行尾加上\来换行分成多行,但是更建议使用括号来包含多行内容。

必要的空格与空行:
    运算符两侧、函数参数之间、逗号两侧建议使用空格分开。
    不同功能的代码块之间、不同的函数定义之间建议增加一个空行以增加可读性。

适当使用异常处理结构进行容错,后面将详细讲解。

软件应具有较强的可测试性,测试与开发齐头并进。

2020.11.9 循环嵌套(break continue)、列表基础

循环嵌套,break continue。举一个例子来:打印前100个素数



基本类型:int,float,bool,str(不可变对象)
容器类型(container):怎么给函数传递很多参数?如何存储很多对象?

字符串、列表
序列:sequence:有序连续存储,因此可以使用下标随机访问


列表的创建、删除

a = [0,1,2,3]

列表(容器)和其包含的对象(元素)的关系?

列表中是否可以包含不同的类型的对象?
嵌套列表,提一下这个概念即可

名字绑定:u = z 

列表拷贝:
list()

列表比较
l4 == l5  # True  值相同
l4 is l5  # False  id不相同

列表的遍历:
for i in l3:
    print(i)

列表拼接:
l1 = [1,'abc',3.3]
l2 = [5]
l3 = l1 + l2   # [1, 'abc', 3.3, 5];是否创建新对象? vs. extend
+= ?

列表+ *
是否创建了新的列表
[1,2,3] + 3?
[1,2,3] * 3
l3 * 3  # [1, 'abc', 3.3, 5, 1, 'abc', 3.3, 5, 1, 'abc', 3.3, 5]


列表的修改?可变对象
del l3[2]  # l3对象id不变
l3[1] = 'abcde'  # 列表可变


几个常用方法:
append extend reverse sort index remove
sorted()函数 


例:给定一个数字列表,将每个元素求修改为其绝对值,然后返回该列表
l9 = [1,-3.39,7,-999]

例:从键盘输入数字到列表(输入非数字则停止),并对列表进行排序(从小到大),然后返回列表

例:给定一个列表,返回某元素在列表中的所有下标,作为一个列表返回
l1 = [1,'a',2,3]
value = 1

例:实现reverse功能

例:冒泡排序(交换);选择排序;堆排序、快速排序(时间复杂度、空间复杂度)

-----
下面的例子太复杂了
l6.append([1,2,3])
l6.append([4,5,6])
l6.append([7,8,9])
for i in range(len(l6)):
    for j in range(len(l6[i])):
        print(l6[i][j], end = '\t')
    print()
l6[0].append(0)
l6.extend((1,2,3))
l5.extend('123')  # extend把'123'看作一个可迭代对象
del(l6[1][1])
l6=[1,2,3]
l7=l6*3  # l7[0],l7[1],l7[2]的id都与l6相同
l3 = [1,'abc',5]
l3[1:]=[3,5,7]  # l3=[1,3,5,7]
l3[1:]=(3,5,7)
l3[1:]=[]
l3.remove(3)
l3.index(1) # 返回第一次出现该元素的下标
l3.reverse()  # 不创建新对象


----
列表浅拷贝的几种方法:
全切片,list(),copy.copy
l4 = l3[:]  # l4 和 l3 id不同,l4是新创建的对象


# 复杂的列表嵌套,进而讲深拷贝
l4 = [l1, l2]  # [[1, 'abc', 3.3], [5]] 
l5 = [[1, 'abc', 3.3], [5]] # l4和l5值相同,不是同一个对象

m = [[1,2,3],[4,5,6],[7,8,9]]
for i in m:
   for j in i:
        print(j, end = '\t')
    print()




2020.11.6 2020.11.6 循环(for while else break continue),range函数,pass语句

下周二上机课再来一次模拟考试,4个编程题,包括循环和列表。
8道题目:顺序,分支,循环,列表,各2道。

自学内容:做习题集会用到两个内容,都先自学一下。大学要培养自学能力。我希望在上课的过程中,教会大家如何自学,如果检验知识。授之以渔。
  字符串格式化:第一次考试(编程题不会考)
  模块的使用:math time random,结合dir help 百度 runoob来学习

为什么需要循环呢?
    从两个例子入手,来解释。写程序之前请大家先画流程图,不断练习流程图。

    例子1:写一个函数,从5个数字中选择最大的数,并返回。
    def func(x1, x2, x3, x4, x5):
        y = x1
        if y < x2:
            y = x2
        if y < x3:
            y = x3
        ...
        return y
    如果是100个数呢?
    问题 1)100个数字如何作为参数传过去呢?100个参数?显然太多了。
    问题 2)即使真的传100个参数,那么这个函数能够做的事情也太局限了,只能处理100个数字;99个数字中选择最大数,还得写另外一个函数
    这两个问题,就引出了列表这种数据类型。即可以把很多数字(变长)放到列表中,传给参数。
    
    处理很多个数字、或者长度不确定的列表,就需要(最好)用循环。否则代码会很冗余。
    def func(x1, x2, x3, x4, x5):
        y = x1
        for x in x2, x3, x4, x5:  # x2, x3, x4, x5其实被隐式的转化为一个元祖tuple对象,for循环对其进行遍历
            if y < x:
                y = x
        return y


    例子2:从一个字符串中统计一个字符(如'a')的次数。字符串类似于列表,也属于长度不定的序列,必须使用循环来遍历。
    while和for都可以做。先画流程图。

循环的语法:
    循环利用for和while两个关键字来操作。流程图runoob有,或者看一下板书。
    https://www.runoob.com/python3/python3-loop.html

    while:
        形式:while condition:
                  code block
        意义:如果满足condition这个条件,while就会执行下去

    for:
        形式:for var in iter:
                  code block
        意义:var是一个变量,iter是可迭代对象,序列就属于可迭代对象(如列表,元组,字符串),var会在这个可迭代对象中循环,直到可迭代对象结束。

    for循环使用起来更方便,会有隐式的遍历语句,自动增加下标和判断是否结束。
    
    死循环:deadlock,是指循环永远不会退出来,也叫无限循环。有的时候是需要无限循环的。
    如果遇到死循环,用Ctrl+C来杀死正在shell运行的程序。
    
    遍历列表操作时,如果要删除列表元素,要非常谨慎。尤其适用for循环时,很容易出错。while循环会安全一些。

    a = 0
    while a < 10:
       print(a)
       a += 2

    表格法来演练循环过程:
        step   a     动作
        0      1     打印’1’ a+=2 (3)
        1      3     打印’3’ a+=2 (5)
        2      5     打印’5’ a+=2 (7)
        3      7     打印’7’ a+=2 (9)
        4      9     打印’9’ a+=2 (11)
        5      11    退出循环

    while中的else语法:
        形式:while condition:
                  code block A
              else:
                  code block B
        意义:由于condition为False而退出循环时,才执行else。反之,如果循环由于break或return而结束,那么就不会执行else子语句。
    for中的else语法:类似于while。
    
    break:从当前循环语句中跳出(包括else一起跳了)。
    continue:退出本次循环,直接进入到下一轮循环。注意,continue会在for循环中取出可迭代对象下一个值。

    range函数:
        range()是一个生成函数(generator,生成器;上课时我称为生成器函数,需要确认一下名称),返回range对象(range是一个类型,即这个函数也是工厂函数)。
        注:生成数字序列是前闭后开的,即range(10),生成的是0, 1, 2, 3, 4, 5, 6, 7, 8, 9
        例:range(15, 3, -2),以15开头,小于等于3结束,步长为-2

    pass语句:
        pass是一个关键字,pass语句是用来空转的,也叫空语句,占位语句。

继续做题,多做题目。
 

2020.11.3 模拟考试总结

常见问题:
    a. 语法错误:程序中出现语法问题将会导致判为0分:
        1. if中出现逗号,例如:
            if a0, a1, a2, a3, a4, a5==0:
        2. else后面带表达式:此处应该用elif
        3. 程序不完整(unexpected EOF):例如用if...else...时,else直接一个冒号就结束了,如果想空掉某些位置请使用pass
        4. if后没有冒号
        5. 小于等于运算符写错:应该是<=而不是=<
        6. 重复def
        7. 使用了中文的括号
        8. 缩进问题
        9. 使用未赋值的变量,尤其是在if判断的时候会出现这样的问题,例如:
            if x>0: 
                a = 1
            print(a)
    b. 变量使用问题:在使用一个变量时,应该首先确保这个变量已经被赋值,同上。
    c. 在代码中使用input导致超时:我们调用你的程序会遇到input()导致无限等待。
    d. 误用中括号,例如:
        return x, [.....]/5
    e. 其他审题要清楚,注意特殊情况下的结果是否与题目给出的样例一致。
    
    注意:考试时,提交的.py中不能有input() print()。
 

2020.11.2 工厂函数,复合函数,条件控制(分支),选择表达式,做题目

print(),指定sep和end参数时只能通过关键字调用。

工厂函数:类型转换,根据一个给定对象,创建一个属于该类型的“新”对象。(同类型也是可以的)
  例如:bool(( )) → False	(空元组用括号囊括一个空格)
        float(‘3e-3’) → 0.003	(e是一种科学计数法,3e-3代表着3*10^-3)
  注:传入工厂函数的对象要符合转换规则,complex转化为int就会返回TypeError,错误的字符串传入float会返回ValueError。

复合函数:x = int(input(‘输入一个数:’)),即函数嵌套函数,一个函数的返回值是另一个函数的传入参数。

条件控制:
  形式:(请不要以过小的分辨率看以下格式,CB是code block的缩写)
if condition:  |  if condition1:    |  if condition1:
  CBA	       |    CBA		    |    CBA
else:	       |  elif condition2:  |    if condition2:
  CBB	       |    CBB		    |      CBB
	       |  else:		    |    CBC
	       |    CBC		    |  else:
	       |		    |    CBD

题目:自己画流程图,写函数。审题,注意边界条件,输入类型,返回结果要求。isinstance()可以判断类型。
  判断一个数字是奇数还是偶数:偶数返回’even’,奇数返回’odd’。
  判断一个年份是否为闰年(能被4整除但是不能被100整除或能被400整除):返回True或者False,传入的year为int型。
  判断三个数字中的最大值:返回最大值。
  传入一个三位自然数,计算并返回其百位十位个位上的数字元组,如果输入的不是三位自然数返回None。

选择表达式:x if x > y else y  (其中x>y是条件判断,x和y必须是两个表达式) (注:赋值语句不是表达式)
  例如:print(‘A’) if x > y else print(‘B’)
        z = x if x > y else y

表达式有哪些?创建对象(理解一下)、算术运算、条件运算、逻辑运算、函数调用(返回对象)
注意:赋值语句不是表达式!

 

2020.10.30 基本数据类型总结(标量 vs. 矢量)、bool、complex、关键字、name命名规则、工厂函数、对象可变与不可变性、内置函数(help, input, print)

基本数据类型(标量scalar):
	int(Python没有限制范围);float(Python不分单精度和双精度,C语言区分);str;bool(boolean);...
	complex(复数):
		形式:例如:1 + 2j
		定义方式:例如:z = 1+2j;z = complex(a, b);z = a + b*(1j)

关键字:程序预定义的有特殊含义的名字;关键字不允许另作它用,否则执行会出现语法错误
	is/ is not:用来判断两个对象是否是同一个对象。简单来说判定一下两个变量是否绑定(binding)在了同一片内存地址(当然这里涉及一些数据结构的问题,不能简单地把对象来等同于内存地址)。
	注:变量名字一旦绑定,以后用到这个名字,就等同于用绑定的对象;
	    x和y指向相同的对象,此时 id(y) == id(x);
	    在Python中,对于一些整数(小于256)或字符串(简单),会共用一块地址。
	del:可以销毁对象,Python中也拥有一种垃圾回收机制,定期将程序(进程)中没有任何名字指向的对象销毁。
	import;and;or;not;if;else;while;for;True;False... (已讲过)
        查看所有的关键字
            import keyword
            print(keyword.kwlist)

对象重用优化:对于一些简单的整数(<256)和字符串对象(注意整数和字符串均为不可变对象),在创建之前,会看内存中是否已有值相同的对象,如果有的话,就会用已有的,而不会重新创建新的对象。
   例如
   x = 123
   y = 123  # 会重用上一个,而不会创建一个新的整数对象
   id(x) == id(y)  # x和y指向同一个对象
   类似的,字符串也是一样的。bool只有两个不同的对象True和False,因此一定会重用。NoneType只有一个对象None,也一定会重用。
   但是,其他类型,如浮点数、复数、列表等,就一定不会重用。
   x = 0.5
   y = 0.5
   id(x) != id(y)
 注意!!上课时走了一个弯路,找到正确的实验方法后,我也没有给出一个合理的解释。现在解释一下:
   id(123456789), id(123456789)
   为什么id是一样的呢?更合理的解释是:这种对象没有name绑定,因此用完就会销毁;第二个整数对象创建时,会在同一个地址上创建


name的命名规则:
	1. 首位:_ a-z A-Z (注意,首位不能是数字)
	2. 后续:_ a-z A-Z 0-9

工厂函数(构造函数):int;float;str;bool;list;dict;tuple;set;complex;...
	既是class类型名,也是一个函数,可以制造相应对象。

标量(scalar):不可分解的,单一的。以int;float;complex; bool。
矢量(vector,也叫向量、容器container):以list;tuple;dict;set为代表
str也是容器,所以称为矢量也可以的,还可以继续分解为更小的字符串。但是str是基本数据类型,不存在更小的数据类型(如字符)。

可变对象和不可变对象:
不可变对象(Immutable Object):int;str;float;bool;complex;tuple(!);frozenset
可变对象:list;dict;set

help函数:
	help(input):这个语句可以调出来帮助文档,help里可以传入函数、模块、对象、名字...
	注:None代表着空数据。

input函数:(我们一般会把函数直接用input()这种方式来写,以后将直接用这种方法来代表函数)
	input()会读入一个字符串,并且会剥离最后一个回车符。
	例如:input: This is Python class.\n 。然后input()会返回'This is Python class.'这个字符串。
	注:不可以用x = input(prompt='pls enter a number') 这种格式。理由如下:
                python3.8加了新的特性,函数可以添加限定位置参数,所以使用prompt传参会报错,课上看help(input)的反斜杠就是限定符标识。详情见:https://zhuanlan.zhihu.com/p/90563819

print函数:
	用法:print(value, ..., sep=' ', end='\n')
	含义:一次可以print()多个数值,每个数值用'sep'分隔,print结束输出一个'end'符。
 

2020.10.26 考试形式、IDE、简单语句、字符串、特殊字符

考试:
电脑阅卷,选择题30分钟20~25个题目,立刻进入编程题,3~5个题目,两个小时。
编程题要提交“.py”文件,不要用shell,文件要保存到一个可以找到的地方。
注:注意养成一个文件管理的好习惯:小心误删误覆盖;可以通过复制粘贴来版本控制;不要放桌面也不让保存的目录太深;...
    考试会让你写个函数,函数名题目会给定,函数要有传入参数,有返回值。对于想拿高分的同学,要注意边界条件,要缜密思考。
    写完函数,用测试语句测试,记得把测试语句注释(#)掉,要不然就用“if __name__ == 'main': ”把测试语句囊括。

PyCharm和IDLE是一个集成的开发环境(IDE:Integrated Development Environment),拥有的功能有:
编辑(edit);运行(run/execute);调试(debug)。PyCharm这学期可能不会讲。
调试方法:单步执行;print();...

简单语句:
	6. 逻辑运算(Logical Operation):
		Q1:operand must be True/False?NO!
		Q2:return value always be True/False?NO!
		例:x = 2 and 3
		    print(type(x))
	            Output:3
		注:非bool型会有一个隐式转换:
				对于int,0 → False
					 != 0 → True
				对于float 0.0 → False
					  != 0.0 → True
				对于str '' → False
	7. 位运算(bit)
	8. 优先级(priority)由高到低:
                各类括号,指数(**),位运算(~; +; -),算数运算(* / % > +  -),关系运算(<; >; ==; >=; <=; !=);逻辑运算(not > and > or),赋值语句(=; -=; +=; /=; *=)
                注:详情请见 https://www.runoob.com/python3/python3-basic-operators.html
复杂语句:函数定义;while;if-else;类定义;...

缩进(Indent):
	为了复合语句,可以嵌套,但是不要写的过于复杂了。
	4个空格或者一个TAB(制表符)为一层缩进。
	注:空格和制表符不能交替使用,不过一般的IDE会自动帮你对齐缩进,并且使用一种缩进方法。
	    制表符不一定是8个空格,可配置,也不一定必须使用4个空格,只要文件内部是一致(consistent)的即可。

字符串(String,简称str):一串连续字符(Character,简称char)。
	只考虑英文字符的话,一个字节内存存一个字符。ASCII表把字符映射成唯一数字。
	“str”是Python内置(预定义提供)的基本数据类型,在Python中,char和str都属于“str”类型。
	1. 定义方式:单引号('这是一个字符串');双引号("这是一个字符串");三单引号('''这是一个字符串)	(有区别吗?)
	2. 转义字符: 
		'\n'回车;'\\'反斜杠;'\t'制表符;'\b'退格符(backspace);'\a'响铃;...
	3. 操作函数:
		+ :一个操作符面对不同场景(操作数类型)有不同的含义,即重载(overloading)。
			例:'abc' + '123' 返回 'abc123'
		len():返回字符串长度。
			例:len('abc\n') 的返回值为4。'\n'是一个转义字符,反斜杠(backslash)打头,代表着换行符(回车)。
	
写一个程序:输出当前时间,新输出的时间刷新旧时间。(提示,利用退格符,PyCharm可以,用cmd也可以,IDLE不行)

2020.10.23 运动会

2020.10.19 Python和英语的对比、简单语句

python(作为语言)和英语作对比, 
字符:大小写字母;数字;#’’...
单词:keywords:while; def;函数名;变量名;数字;字符串。和英语语言不一样,单词可以不符合英语字典里的单词,比如'_a123'对于python也是合法的变量名
句子:statement vs sentence
段落:复合语句,文件,包 vs 节,章,篇,书
语法:非常严格(格式和语法都很严格) vs 比较随意
程序语言和英语哪个难?当然是英语,程序语言有唯一语义。

语句 (statement):
简单语句:
	1. 赋值语句assignment:把一个对象(object)绑定(binding)到一个名字(name, 标识符, identifier)上。
		例如:	x = 7	→	把整数对象绑定在了x上。
		注:object是内存中实际存在的东西,有4个属性(attribute):
				id (identity,地址);
				类型 (数据类型,类名,type,class);
				数据值/内容;
				方法 (method / function) (主要是class类中,详情见后面章节)。
			程序执行过程中,不会有重名。
	2. 函数调用:
		内嵌函数 (build-in):print;abs;help;...	。无需引入“包”即可使用,python默认提供。
		import math:math.sqrt(); math.pow(); math.log(); ...
	3. import:把一个包引入到当前文件。
	4. 算数运算(Arithmetic):加 + ;减 - ;乘 * ;除 / ;整除 // ;余数 % 
	5. 关系运算(Relational):数字或字符串比大小,小于 < ;大于 > ;等于 == ;不等于 != 。返回bool型,即True & False。
	6. 逻辑运算(Logical Operation/Calculus):and ;or ;not。
		例如:3>2 and 2<1。
        注:逻辑运算符号的两边不一定要是bool型,返回的结果也不一定是bool型,请自行测试学习。
	注:运算注意object的type类型;注意算术符优先级;字符串比大小有个字母序(alphabetic)。
复杂语句:函数定义;while;if-else;类定义;...
 

2020.10.16 计算机组成、数据结构、算法、流程图

计算机组成
  冯诺依曼架构
A processing unit that contains an arithmetic logic unit and processor registers (ALU)
A control unit that contains an instruction register and program counter (CU)
Memory that stores data and instructions
External mass storage
Input and output mechanisms
   https://en.wikipedia.org/wiki/Von_Neumann_architecture
   https://zh.wikipedia.org/zh-hans/%E5%86%AF%C2%B7%E8%AF%BA%E4%BC%8A%E6%9B%BC%E7%BB%93%E6%9E%84
   https://www.baidu.com/link?url=WUyrwd9zkEs6eVKyVR9Emg4_pkDsGxJLyrcixtszhapi6XO92QXBlbW-B8f_6dooqxiExzUKir5bCoZhZNvNefxSPO5WSIsI_E-lM2XUgSp5i2i7WY0Ip7tTSwXuy4rEsgtrYO5HOAHElbzI0P1O2mdy-jz9K4-Dx_xvd01rImKxbfrOKyOE4O7cW5U-94xh3XOvQK-8qcWUmN_EnFy2NqauxvnNXHKwWbYN9ZW5JKl8MgTi_HkZ7c6LG75yQ58UZ49MAY98NtbDAVCUXAPruPeO81ozIt36bB1jZOZRQw2PpFK7VV5euTIWOs68_D-i&wd=&eqid=e2294df70000e186000000045f7fd18c

数据和算法
  计算 数据
  流程图、伪代码:平方根
  平方根的其他解法,更优的:https://note.youdao.com/ynoteshare1/index.html?id=828b637ef7ff73a51dd26c1bc59be3e9&type=note

2020.10.12 自我介绍、大学生活学习建议、课程介绍

自我介绍
  演示几个平台

对同学的摸底,能力强的同学,不妨做我的基础编程练习,由简入繁,不断积累

大学生活、学习的几点建议

课程介绍(过程化课程)
  课堂提问、上机实验(代码和报告)、期中、期末多次考试