每周导学-第二周-python基础

Things may come to those who wait, but only the things left by those who hustle.

Hi,同学们,经过第一周的学习,我们已经完成了项目一,是不是成就感爆棚!自信心爆棚呀!那请继续保持着这样的自信心和学习动力,继续我们的课程吧!

本周开始,我们就进入到了项目二(P2)阶段,本阶段总共包含四周,在这一个月内,我们要对Python入门进行学习,并使用这门新技术完成项目二:探索美国共享单车数据,以下便是这四周的学习安排:

时间 学习重点 对应课程
第1周 Python基础内容 数据类型和运算符、控制流、函数、脚本编写
第2周 Python数据处理内容 Numpy & Pandas - 第一、二部分
第3周 完成项目 项目:探索美国共享单车数据
第4周 项目修改与通过 修改项目、查缺补漏、休息调整

对于非小白同学来说,本阶段内容不是很难,希望你们能在三周内完成并通过项目;

对于小白来说,本阶段可能是个挑战,请一定要保持自信,请一定要坚持学习和总结,如果遇到任何课程问题请参照如下顺序进行解决:

饭要一口一口吃,路要一步一步走,大家不要被任务吓到,跟着导学一步一步来,肯定没问题哒!那我们开始吧!

注:本着按需知情原则,所涉及的知识点都是在数据分析过程中必须的、常用的,而不是最全面的,想要更丰富,那就需要你们课下再进一步的学习和探索!

本周目标

  • (必选)课程中的编程入门 - Turtle为体验课~对没有编程经验的小白同学十分友好,必看!
  • (必选)学习课程中数据类型和运算符脚本编写部分,掌握Python语言的基础。
  • (可选)配置本地编译环境。

学习计划

时间 学习资源 学习内容
周二 微信群 - 每周导学 预览每周导学
周三、周四 Udacity - Classroom 数据类型 - 脚本编写
周五 微信/Classin - 1V1 课程难点
周六 Classin - 优达日 本周学习总结、答疑
周日 笔记本 总结沉淀
周一 自主学习 查漏补缺

本周知识清单

编程入门 - Turtle

本节中,选择了python中一个画图的工具——Turtle为例,带大家在轻松有趣的画图中,了解python的变量、循环等知识,对没有编程基础的小白同学十分友好~相信你们通过这节课,肯定会爱上python的,哈哈~

0 (可选)环境搭建

标题后面小括号中的数字即为对应课程的第几课节,如:算术运算符(2,3)即表示对应课程中为第2、3课节。

虽然是可选,但强烈推荐大家在本地搭建Python编程环境,你所需的只是有限的几步操作,却能在之后的学习和项目中给你带来无限的便捷!

  • 强烈推荐!按照课程中,第7章节Anaconda和Jupyter Notebook的详细步骤,完成本地环境的搭建。完成后你将获得:Python的本地IDESpyder以及数据分析师最爱的交互式笔记本Jupyter Notebook
  • Spyder的简明教程,光看不顶用,一定要多实操。
  • 另外,还简单推荐一款Python的编辑器Atom,可以在官网进行下载,然后可以参考博客Atom的python插件和常用插件安装一些针对python的拓展包。没有python相关拓展包的Atom做起python来就像是 用记事本再写代码?所以一定要装拓展包哦!
  • Atom的教程,课程5里面也有涉及到;除此之外,还可参考Atom基本操作,完成拓展包的下载与安装。

安装好之后尝试你的第一个python代码吧!

1
print('Hello world!')

1 Python基础语法

想要学好一门语言,语法作为语言中法律一样的存在,是非常重要的,所以请大家一定要恪守这个法律,在初学阶段打好基础,不要养成不良的编码习惯。

  • 行与缩进

    python最具特色的就是使用缩进来表示代码块, 同一个代码块的语句必须包含相同的缩进空格数,缩进的空格数是可变的,但是有个不成文的规定就是使用4个空格的缩进。

    比如:

    1
    2
    3
    4
    if True:
    print ("True")
    else:
    print ("False")

    但如果像如下这样就会因为缩进问题报错:

    1
    2
    3
    4
    5
    6
    if True:
    print ("Answer")
    print ("True")
    else:
    print ("Answer")
    print ("False") # 缩进不一致,会导致运行错误

    报错会提示如下:

    1
    IndentationError: unindent does not match any outer indentation level

    所以,如果你的程序运行后,出现这种错误提示,那你就要检查下,你的代码缩进是不是有问题了。

  • 注释

    Python中单行注释以 # 开头,多行注释可以用多个 # 号,或者 ‘’’和 “””(主要作声明函数用),示例如下:

    1
    2
    3
    4
    5
    6
    7
    # 注释1
    # 注释2
    def hello():
    '''
    this is a print function.
    '''
    print ('Hello,Python!')
  • 更多更详细的python编写规范请参考PEP8规定。(或者查看中文版

2 数据类型和运算符

数据类型

分类

  • 数字(Number):支持整型(int)、浮点型(float)、布尔型(bool) (7,8)

    在混合计算中,python会把整型转化成浮点型

  • 字符串(String):用单引号 ‘ 或双引号 “ 括起来 (11,12)

    用+连接,用*重复;字符串截取的格式为:变量[头下标:尾下标]

  • 列表(List):写在方括号 [] 之间,用逗号分隔开的元素列表。 元素可以是数字、字符串或者列表(17-20)

    用+连接;截取的格式同字符串

  • 元组(Tuple):与列表类似,但是不可更改,写在小括号 () 里,元素之间用逗号隔开。(21,22)

    用+连接;截取的格式同字符串

  • 集合(Set):无序不重复元素的序列。 (23,24)

    筛选出列表a中的不重复元素,可以直接使用set(a)

  • 字典(Dictionary) :写在大括号{ }里,是一个无序的键(key) : 值(value)对儿集合(25-27)

    key必须为不可变类型,且唯一

不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);

可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

相互转换

函数 描述
int(x) 将x转换为一个整数
float(x) 将x转换到一个浮点数
str(x) 将对象 x 转换为字符串
list(s) 将序列 s 转换为一个列表
set(s) 转换为集合(元素唯一)

运算符

算术运算符(2,3)

假设 a = 12, b = 26

运算符 描述 实例
+ 加,数字就是做加法/字符串就是拼接 a + b 输出结果 28
- 减,做减法 a - b 输出结果 -28
* 乘 ,数字的话就是相乘/字符串的话就是重复若干次 a * b 输出结果 312
/ 除,做除法 b / a 输出结果 2.1666666666666665 (自动转化为浮点型)
% 取模 , 即做除法后的余数 b % a 输出结果 2
** a**b 为12的26次方
// 取整,即做除法后的商 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0

赋值运算符(4,5,6)

运算符 描述 实例
= 简单的赋值运算符 c = a + b 将 a + b 的运算结果赋值为 c
+= 加法赋值运算符 c += a 即 c = c + a(常用 i += 1,表示递增)
-= 减法赋值运算符 c -= a 即 c = c - a

比较运算符(9,10)

运算符 描述
== 等于;比较对象是否相等
!= 不等于; 比较两个对象是否不相等
> 大于 ; 返回x是否大于y
< 小于 ;返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。
>= 大于等于;返回x是否大于等于y。
<=< td> 小于等于;返回x是否小于等于y。

逻辑运算符

运算符 逻辑表达式 描述
and x and y 即逻辑 “与”
or x or y 即逻辑 “或”
not not x 即逻辑 “非”

成员运算符

即查看指定的序列中是否存在某值,这个序列可以是字符串、列表或者元组。

运算符 描述
in 找到值返回 True,否则返回 False。
not in 与in相反

恒等运算符

运算符 描述
is 检查两边是否恒等
is not 检查两边是否不恒等

布尔运算符

python中的True和False有多种条件判断,更详细的请戳Python中的True, False条件判断,请务必查看或者添加书签。

3 控制流

条件语句if

  • 代码模板:

    1
    2
    3
    4
    5
    6
    7
    8
    if <条件判断1>:
    <执行1>
    elif <条件判断2>:
    <执行2>
    elif <条件判断3>:
    <执行3>
    else:
    <执行4>

    注意:一定要注意缩进与对齐,尤其是有if语句嵌套的情况下。

循环语句

  • for循环

    • for循环可以遍历任何序列的项目,如一个列表或者一个字符串,通俗点说,就是把这个序列中的第一个元素到最后一个元素依次访问并执行冒号后面的语句

    • 其一般格式为:

      1
      2
      for <元素> in <序列>:
      <执行语句>
  • while循环

    • for循环和while循环,两者的相同点在于都能循环做一件重复的事情;不同点在于,for循环是在序列穷尽时停止,while循环是在条件不成立时停止。 当这个条件永远不为False时,就会出现死循环。

    • 其一般格式为:

      1
      2
      while <判断条件>:
      <执行语句>
  • break和continue

    • break 语句可以跳出 for 和 while 的循环体。

      示例:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      for letter in 'Udacity':     # for实例
      if letter == 't':
      break
      print ('当前字母为 :', letter)

      i = 10 # while实例
      while i > 0:
      print ('当期变量值为 :', i)
      i -= 1
      if i == 5:
      break

      执行语句后的输出结果为:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      当前字母为 : U
      当前字母为 : d
      当前字母为 : a
      当前字母为 : c
      当前字母为 : i
      当期变量值为 : 10
      当期变量值为 : 9
      当期变量值为 : 8
      当期变量值为 : 7
      当期变量值为 : 6
    • continue是跳过当前循环块中的剩余语句, 也就是跳过continue后面的语句

      示例:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      for letter in 'Udacity':     # for实例
      if letter == 't':
      continue
      print ('当前字母为 :', letter)

      i = 5 # while实例
      while i > 0:
      i -= 1
      if i == 3:
      continue
      print ('当期变量值为 :', i)

      执行代码后的输出结果为:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      当前字母为 : U
      当前字母为 : d
      当前字母为 : a
      当前字母为 : c
      当前字母为 : i
      当前字母为 : y
      当期变量值为 : 4
      当期变量值为 : 2
      当期变量值为 : 1
      当期变量值为 : 0

综上呢,for更适合可迭代情况下使用,while更适合不知道要循环多少次的时候使用。

  • zip函数

    • zip函数的输入位可迭代的对象,输出为对应元素的元组

    • 其一般格式为:

      1
      zip([a],[b])
    • 使用zip函数可以节约不少内存

    • 可以使用list()来转换输出zip函数的结果

    • 若zip的两个输入序列长度不一致,则以短的那个为参考

    • *zip可以理解为zip的反函数,可以将元组解压为列表

    • 查看更多

    示例:

    1
    2
    3
    4
    5
    6
    a = [1,2]
    b = [3,4]
    c = [5,6,7]
    zip_1 = zip(a,b)
    zip_2 = zip(a,c)
    a1,c1 = zip(*zip_1)

    执行代码,输出结果为:

    iO2lJH.png

  • enumerate函数

    • 该函数是将一个可遍历的数据对象(如列表、元组或字符串)组合为一个带索引和元素的元组

    • 其一般格式为:

      1
      2
      enumerate(<序列>, start=0)
      #start表示下标的起始位置
    • 常与for…in…联用

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    a = [1,2]

    print('起始下标为默认:')
    for i,j in enumerate(a):
    print(i,j)

    print('起始下标为1:')
    for i,j in enumerate(a,start = 1):
    print(i,j)

    执行代码,输出结果为:

    1
    2
    3
    4
    5
    6
    起始下标为默认:
    0 1
    1 2
    起始下标为1:
    1 1
    2 2

列表推导式

  • 可以简单理解为:定义一个空表,然后用表中的循环语句填充该表。

  • 其一般格式为:

    1
    [表达式 for 变量 in 序列或迭代对象]

4 函数

定义函数

  • 其一般格式为:

    1
    2
    3
    4
    5
    def 函数名(参数):
    '''
    函数说明
    '''
    函数语句
    • 函数说明是建议非必需
    • 函数语句最后以return(表达式)结尾,则返回值;若不带表达式,则返回None

参数

默认参数和关键字参数不在赘述,在此只讲述一种不定长参数

  • 若在参数前面加一个星号*,则将所有未命名的参数以元组的形式导入;
  • 若在参数前面加两个星号**,则参数会以字典的形式导入。

示例:

1
2
3
4
5
6
7
8
9
10
11
#定义函数
def tupleprint(a, *tupleb ):
'''
打印任何传入的参数
'''
print ("输出: ")
print (a)
print (tupleb)

#调用函数
tupleprint(1,2,3)

执行代码,输出结果为:

1
2
3
输出: 
1
(2, 3)

变量作用域

变量的作用域就是能访问该变量的程序部分。

  • 在python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域 ,而其他如if/for/while等是不会引入新的作用域的。

  • 全局变量即可以在整个程序范围内都可以访问;局部变量只能在其被定义的函数内调用。

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    global_a = 0 # 这是一个全局变量
    # 定义函数
    def sum( a, b ):
    global_a = a + b # global_a在这里是局部变量.
    print ("局部变量为: ", global_a)
    return global_a

    #调用函数
    sum(1,2)
    print ("全局变量为: ", global_a)

    执行代码,输出结果为:

    1
    2
    局部变量为:  3
    全局变量为: 0
  • na当局部代码想要修改全局变量时,就会用到global和nonlocal关键字了 。

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    num = 1
    def fun1():
    global num # 需要使用 global 关键字声明
    print(num)
    num = 123
    print(num)
    fun1()
    print(num)

    执行代码,输出结果为:

    1
    2
    3
    1
    123
    123

    nonlocal的用法类似,用在嵌套函数中,当只想修改嵌套作用域的变量而非全局变量时使用。

可更改对象与不可更改对象

在数据类型中也提到过,python中的可变类型(列表、字典和集合)与不可变类型(数字,字符串和元组),那在函数中作为变量进行传递时会是怎样呢?

示例1:

1
2
3
4
5
6
7
8
#定义函数
def fun1(a):
a = 2
print(a)

b = 1
fun1(b)
print(b)

示例2:

1
2
3
4
5
6
7
def fun2(list_a):
list_a.append(2)
print(list_a)

list_b = [0,1]
fun2(list_b)
print(list_b)

尝试下,上面这两个示例的输出结果,有什么区别?

匿名函数

  • 使用lambda创建

  • 所谓匿名,就是不需要def语句

  • 拥有自己的命名空间,而且只能访问自己命名空间中的变量

  • 语法格式为:

    1
    lambda <变量>:<语句>

迭代器与生成器

了解即可,更多可以戳:参考

5 脚本编写

输入和输出

  • 输入:input函数

    示例:name = input(“请输入您的姓名:”)

  • 输出:print函数和表达式语句

    • 输出格式化:在第8课节中,出现了一个format函数,这个函数就是格式化的利器
    • 其基本用法: print('大家好,我是{},今年{}岁。'.format('Allen',25))
    • 更多用法:字符串格式化数字格式化%及format用法

错误与异常

掌握try语句的用法就好。

  • try:这是 try 语句中的唯一必需子句。该块中的代码是 Python 在 try 语句中首先运行的代码。
  • except:如果 Python 在运行 try 块时遇到异常,它将跳到处理该异常的 except 块。
  • else:如果 Python 在运行 try 块时没有遇到异常,它将在运行 try 块后运行该块中的代码。
  • finally:在 Python 离开此 try 语句之前,在任何情形下它都将运行此 finally 块中的代码,即使要结束程序,例如:如果 Python 在运行 exceptelse 块中的代码时遇到错误,在停止程序之前,依然会执行此finally 块。

读写文件

  • open()即打开文件,用法如下:

    1
    open(文件名, 读写模式)
  • 常用的读写模式:

    | 模式 | 描述 |
    | —- | ———————————————————– |
    | r | 只读。默认模式 |
    | rb | 二进制只读。 |
    | r+ | 读写。 |
    | rb+ | 二进制读写。 |
    | w | 写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除,不想删除可参考模式a。如果该文件不存在,创建新文件。 |
    | wb | 二进制写入。其余同上 |
    | w+ | 读写。其余同上 |
    | wb+ | 二进制读写。其余同上 |
    | a | 追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
    | ab | 二进制追加。其余同上 |
    | a+ | 读写。其余同上 |
    | ab+ | 二进制追加。其余同上 |

导入本地模块/函数

如果觉得课程中的解释有些晦涩,可以戳:如何简单地理解Python中的if name == ‘main

项目相关

本周是P2的第一周,大家除了完成以上学习任务之外呢,还要为P2项目提前准备以下几个方面:

  • 完成本地环境的搭建
  • 下载P2的项目文件,若教室下载失败的话,请戳我微信,分享百度云给你
  • 完成项目的课节1-3,对即将挑战的项目有一个大概的了解,然后在学习中有的放矢

最后

如果项目一还没通过,请一定要抓紧时间!一定要在本周三之前顺利通关!大家一定要对自己有信心,然后,对自己狠一点!加油!

Allen Jia wechat
扫一扫订阅我的公众号
听说你要请我喝杯咖啡?