前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >#小手一抬学Python# Python语法基础干货盘点【附源码】

#小手一抬学Python# Python语法基础干货盘点【附源码】

原创
作者头像
程序员迪迪
发布2022-01-05 17:35:51
1.6K0
发布2022-01-05 17:35:51
举报

前言

参考资料

笔者Python学习主要以《Python编程:从入门到实战》这本书为主,笔记的思路参考书里的脉络。其次还有笔者一年前在慕课上看的北理的嵩天教授的Python课程。嵩天教授的课很好,最大的特点是每个版块都有完整的示例代码。但可能对新手小白不太友好,有些不常用的函数容易弄混。《Python编程:从入门到实战》更适合零基础学习,里边会提到一些互通的编程思想和Python的格式规范。

结合常用函数、方法

由于笔者有Java的编程基础,因此这里只记录Python跟Java不一样的地方以及一些易忘点和难点,重点放在Python的语法基础。对于新手朋友还是先看书为好。结合《Python常用函数、方法示例总结(API)》来看可能效果会好一些。


1. 变量与简单数据结构

  • .py指出这是一个Python程序,编辑器将使用Python解释器运行它;
  • Python解释器读取整个程序,确定其中每个单词含义;
  • 程序无法成功运行时,解释器会提供一个traceback。traceback是一条记录,指出解释器尝试运行代码时,在什么地方陷入困境;
  • 在Python中,可以用单引号双引号括起字符串;
  • Python中的转义符:
    • \n换行(光标到下行首);
    • \r回车(光标回到本行首);
    • \t制表符,\n\t表示换行并在下一行开头添加制表符;
    • \b回退;
  • Python2中,有些print语句包含括号,有些不包含;
  • Python使用两个乘号表示乘方,如:3 ** 2 == 9
  • Python2中除法\将小数部分直接删除。Python3中保留小数。但在Python2中:3.0 / 2 == 1.5
  • Python之禅:Python的一些编程理念。在终端输入import this即可获取;
  • Python关键字:undefined
  • Python内置函数:undefined

2. 列表相关

  • 一个列表示例:bicycles = [ 'trek', 'cannondale', 'redline']。注意方括号逗号 打印列表示例:print(bicycles) 访问列表元素:bicycles[0] --- > trek; 访问列表倒数第x元素:bicycles[-x] --- > 当x=1时输出:redline; 使用for循环遍历列表:for object in list: print(object)
  • 列表解析list = [num**2 for num in range(1s, 11)] ---> 输出1到10的平方;
  • 遍历部分列表for object in list[firstNum: lastNum]:
  • 可以使用list[:]的方法复制列表;
  • 元祖相关:
    • Python中将不能修改的值称为不可变的,而不可变的列表称为元祖
    • 在编程上与列表不同之处在于其使用()tuple()或不使用括号;而列表使用[]list()
    • 元组因为创建后不能修改,因此没有特殊操作;
  • 如果提出修改Python语言修改建议,需要编写Python改进提案(PEP)。PEP 8是最古老的PEP之一,其规定了以下一些Python代码格式规范:
    • 每级缩进4个空格。需要对文本编辑器(或ide)设置tab键为4个空格;
    • Python解释器根据水平缩进解读代码,不关心垂直间距;
    • 建议每行不超过个字符;
    • 建议比较运算符两边各添加一个空格;

3. 集合

  • 一个集合示例:bicycles = { 'trek', 'cannondale', 'redline'}。注意大括号逗号
  • 集合的特点是不能重复;
  • 利用集合数据去重:
代码语言:txt
复制
```
代码语言:txt
复制
s = set(list)  #利用集合无重复元素的特点去重
代码语言:txt
复制
l = list(s)  #将集合转变回列表
代码语言:txt
复制
```

4. If语句

  • Python在检查是否相同时考虑大小写;
  • 大部分时候检查两个指不等的效率更高;
  • 在Python中使用andor表示并与或,而不是&&||
  • 检查列表是否含有特定值的语句:if(object in list),也可以用if(object not in list)
  • Python的if语句基本结构如下(注意冒号):` if conditional_test1: do something1 elif conditional_test2: do something2 else: do other
  • 判断列表是否为空:if list:

5. 字典

  • 事实上,可将任意Python对象用作字典中的值;
  • 一个字典的示例:alien0 = {'color': 'green', 'points': 5}
  • 遍历字典for key, value in map.items():
  • 遍历字典的键for object in map.keys():for object in map:,因为遍历字典默认遍历所有的键;
  • 按顺序遍历字典所有的键:for object in sorted(map.keys()):
  • 遍历字典的值for object in map.values():
  • 遍历字典的值,剔除重复项:for object in set(map.values()):
  • 列表和字典的嵌套层级不应太多,如果太多,可能有更简单的解决问题的方案;

6. 用户输入和while循环

  • 在Python 3里使用input()方法,而在Python 2.7里使用raw_input()方法;
  • 循环语句:while conditional_test:
  • 可以使用break关键字退出循环,这里的循环包括while和for循环;
  • 可以使用continue关键字继续循环;
  • 使用循环处理列表:while object in list:

7. 函数

  • 不带返回值的函数定义示例:
代码语言:txt
复制
```
代码语言:txt
复制
def greet_user(username, age=1):  #username没有设定默认值必须放在形参列表开头
代码语言:txt
复制
  """显示简单问候语"""
代码语言:txt
复制
  print("hello, " + username.title() + ", age is " + str(age))
代码语言:txt
复制
greet_user('jesse', 18)  #位置实参
代码语言:txt
复制
greet_user(age=18, username='jesse')  #关键字实参
代码语言:txt
复制
greet_user('jesse')  #使用默认值age=1
代码语言:txt
复制
```
代码语言:txt
复制
*   第二行为**文档字符串注释**,描述函数是做什么的;
*   后面为函数调用;带普通返回值的函数定义示例:
代码语言:txt
复制
```
代码语言:txt
复制
def greet_user(username, age=1):  #username没有设定默认值必须放在形参列表开头
代码语言:txt
复制
  """显示简单问候语"""
代码语言:txt
复制
  print("hello, " + username.title() + ", age is " + str(age))
代码语言:txt
复制
  return username.title()
代码语言:txt
复制
```
  • 带字典返回值的函数定义示例:
代码语言:txt
复制
```
代码语言:txt
复制
def build_person(first_name, last_name):  #username没有设定默认值必须放在形参列表开头
代码语言:txt
复制
  """返回字典"""
代码语言:txt
复制
  person = {'first': first_name, 'last': last_name}
代码语言:txt
复制
  return person
代码语言:txt
复制
```
  • 传递列表参数,列表会修改:
代码语言:txt
复制
```
代码语言:txt
复制
def greet_users(names):
代码语言:txt
复制
  """传入参数为列表"""
代码语言:txt
复制
  for name in names:
代码语言:txt
复制
      msg = "Hello, " + name.title() + "!"
代码语言:txt
复制
      print(mas)
代码语言:txt
复制
usermanes = ['margot', 'hannah', 'ty']
代码语言:txt
复制
greet_users(usernames)
代码语言:txt
复制
```
  • 传递列表参数的副本,列表不会修改:def greet_users(names[:]):
  • 传递任意数量的实参:*toppings可以理解成列表;
代码语言:txt
复制
```
代码语言:txt
复制
def make_pizza(*toppings):
代码语言:txt
复制
  """打印顾客点的所有配料"""
代码语言:txt
复制
  print(toppings)
代码语言:txt
复制
make_pizza('pepperoni')
代码语言:txt
复制
make_pizza('mushrooms', 'green peppers', 'etra cheese')
代码语言:txt
复制
```
代码语言:txt
复制
*   Python创建一个名为toppings的空元组;结合使用位置实参和任意数量实参:
代码语言:txt
复制
```
代码语言:txt
复制
def build_profile(name, **user_info):
代码语言:txt
复制
  """创建一个字典,其中包含我们知道的有关用户的一切"""
代码语言:txt
复制
  profile = {}
代码语言:txt
复制
  profile['name'] = name  
代码语言:txt
复制
  for key, value in user_info.items():
代码语言:txt
复制
      profile[key] = value
代码语言:txt
复制
  return profile
代码语言:txt
复制
user_profile = build_profile('albert', location='princeton', field='physics')
代码语言:txt
复制
print(user_profile)
代码语言:txt
复制
```
  • 在Python中,import的是模块,使用模块.方法(参数)即可调用模块里的函数;
  • 导入特定函数,并使用该函数示例:` from module_name import function_0, function_1 function_0() function_1(参数)
  • 使用as给函数指定别名:from model import function as fn;后续使用fn()即可调用function函数;
  • 使用as给模块指定别名:import model as md;后续使用md.function()即可调用函数;
  • 导入模块所有函数:from model import *;后续直接使用model里的函数function()即可调用函数;
  • 可以在函数类使用global关键字声明变量是全局变量;
  • lambda表达式<函数名> = lambda <参数> : <表达式>
代码语言:txt
复制
*   示例:
```
    
代码语言:txt
复制
    >>> f = lambda x, y : x + y
代码语言:txt
复制
    >>> f(10, 15)
代码语言:txt
复制
    25
代码语言:txt
复制
    ```
代码语言:txt
复制
> > > f = lambda : "lambda表达式"  
> > > print(f())  
> > > lambda表达式
```
  • 函数与模块编写细节:
    • 外部函数导入的推荐做法:只导入所需要使用的函数 / 导入整个模块并使用句点表示法;
    • 函数和模块的命名应使用小写字母和下划线,而不是驼峰命名法;
    • 函数注释紧跟在函数定义后面,使用文档字符串格式;
    • 给形参指定默认值时,等号=两边不要有空格;

8. 类与对象

  • 类中的函数叫方法;
  • 一个类示例:模块名为dog.py
代码语言:txt
复制
```
代码语言:txt
复制
"""表示小狗和电子狗的类"""
代码语言:txt
复制
class Dog():
代码语言:txt
复制
  """模拟小狗"""
代码语言:txt
复制
  def __init__(self, name):
代码语言:txt
复制
      """初始化实例"""
代码语言:txt
复制
      self.name = name
代码语言:txt
复制
      self.age = 1  #给属性指定默认值
代码语言:txt
复制
  def get_age(self):
代码语言:txt
复制
       """返回年龄"""
代码语言:txt
复制
       return self.age
代码语言:txt
复制
  def set_age(self, age):
代码语言:txt
复制
      """设置年龄"""
代码语言:txt
复制
      self.age = age
代码语言:txt
复制
  def sit(self):
代码语言:txt
复制
      """模拟小狗被命令时蹲下"""
代码语言:txt
复制
      print(self.name.title() + " is now sitting.")
代码语言:txt
复制
class TinyDog(Dog):
代码语言:txt
复制
  """小狗是狗的子类"""
代码语言:txt
复制
  def __init__(self, name)
代码语言:txt
复制
      """初始化父类的属性"""
代码语言:txt
复制
      super().__init__(name)
代码语言:txt
复制
```
代码语言:txt
复制
*   `__init__()`方法:形参self必不可少,而且必须位与其他参数前面;
*   创建Dog实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,其是一个指向实例本身的应用,让实例能够访问类中的属性和方法;
*   `self.`为前缀的变量都可供类中的所有方法使用,像这样可以通过实例访问的变量称为属性;有关父子类:
代码语言:txt
复制
*   子类和父类必须包含在当前文件中,父类必须在子类前面;
*   子类定义中括号内必须指定父类名称;
*   `super()`是一个特殊函数,将父类和子类关联起来;
*   在Python 2.7中,`super()`方法需要传递两个实参:**子类名**和**self**,并且父类定义的括号内指定字段**object**;在Python 2.7中创建类时,需要在括号类内包含单词
  • 类实例(对象)的示例:
代码语言:txt
复制
```
代码语言:txt
复制
class Dog():
代码语言:txt
复制
  --snip--
代码语言:txt
复制
my_dog = Dog('willie')
代码语言:txt
复制
dog_name = my_dog.name  #获取属性
代码语言:txt
复制
dog_name = my_dog.get_age()  #通过方法获取属性
代码语言:txt
复制
my_dog.name = 'jucy'  #直接修改属性
代码语言:txt
复制
my_dog.set_age = 18  #通过方法修改属性
代码语言:txt
复制
my_dog.sit()  #调用方法
代码语言:txt
复制
```
  • dog.py模块里导入多个类:from dog import Dog, TinyDog
  • 导入整个dog.py模块,然后用句点表示访问需要的类:import dog
  • collections模块里包含一个类OrderedDict。该类的实例行为几乎与字典相同,区别在于其记录了键值对的顺序;
  • 类的编码风格:
    • 类采用驼峰命名法,类中的每个单词首字母大写;
    • 实例名和模块名采用小写,并在单词之间加上下划线;
    • 一个空行分隔方法;两个空格分隔类;
    • 需要同时导入标准库和模块和

9. 文件

  • 打开并读取一个文件,并将其内容显示到屏幕上:
代码语言:txt
复制
```
代码语言:txt
复制
with open('xxx.txt') as file_object:
代码语言:txt
复制
  contents = file_object.read()
代码语言:txt
复制
  print(contents)
代码语言:txt
复制
```
代码语言:txt
复制
*   打开文件`open()`和关闭文件`close()`可以同时使用,但当有bug时`close()`执行不了会导致文件无法关闭。不写`close()`将由Python确定是否关闭文件;
*   `with`关键字在不再需要访问文件后将其关闭;
*   直接打印contents会多出一个空行,可以这样打印`print(contens.rstrip())`;有关文件绝对路径:Linux和OS X:
代码语言:txt
复制
```
代码语言:txt
复制
with open(filename) as file_object:
代码语言:txt
复制
  for line in file_object:
代码语言:txt
复制
  print(line)
代码语言:txt
复制
```
代码语言:txt
复制
*   同理,直接打印contents会多出一个空行,可以这样打印`print(line.rstrip())`;使用

10. 异常

  • 使用 try-except 处理异常:
代码语言:txt
复制
```
代码语言:txt
复制
try:
代码语言:txt
复制
  print(5/0)
代码语言:txt
复制
except ZeroDivisionError:
代码语言:txt
复制
  print('捕获到ZeroDivisionError异常')
代码语言:txt
复制
else:
代码语言:txt
复制
  print('未捕获异常')
代码语言:txt
复制
finally:
代码语言:txt
复制
  print('无论是否有异常都会执行')
代码语言:txt
复制
```
代码语言:txt
复制
*   可在`except`的缩进块里添加关键字**pass**跳过错误捕获;
*   其中,`else`和`finally`部分的代码块可省;

11. 测试

  • 使用Python标准库中的模块unittest进行测试;
  • 一个简单的测试示例:
代码语言:txt
复制
```
代码语言:txt
复制
import unittest
代码语言:txt
复制
from model_name import function_name
代码语言:txt
复制
class TestCase(unittest.TestCase):
代码语言:txt
复制
  """测试函数function_name"""
代码语言:txt
复制
  def setUp(self):
代码语言:txt
复制
      """构建前置条件"""
代码语言:txt
复制
  def test_function(self):
代码语言:txt
复制
      run_result = function_name(parameter)
代码语言:txt
复制
      self.assertEqual(run_result, correct_result)
代码语言:txt
复制
unittest.main()
代码语言:txt
复制
```
代码语言:txt
复制
*   首先导入模块`unittest`和被测试方法`function_name`;
*   然后创建`TestCase`类,其包含各种具体的单元测试方法。该类继承`unittest.TestCase`类;
*   `setUp()`方法的作用是创建前置条件;
*   编写测试方法`test_function`,方法名必须以`test_`打头;
*   使用断言`assertEqual()`判断函数执行结果与预期结果的差别;
*   `unittest.main()`让Python运行这个文件中的测试;unittest里常用的6个断言方法请见;每完成一个测试,Python都会打印一个字符:测试通过打印句点 

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 1. 变量与简单数据结构
      • 2. 列表相关
        • 3. 集合
          • 4. If语句
            • 5. 字典
              • 6. 用户输入和while循环
                • 7. 函数
                  • 8. 类与对象
                    • 9. 文件
                      • 10. 异常
                        • 11. 测试
                        相关产品与服务
                        文件存储
                        文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档