{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 编程入门01:Python基础语法\n",
    "现在让我们从基础概念开始逐步探索Python的语法,编程语言包含多种指令,其中最基本的是“表达式”(Expression),表达式有特定的“值”(Value),例如:1就是一个最简单的表达式,它的值就是1,当你在交互模式下输入1,计算机会返回这个表达式的值1。使用“运算符”(Operator)可以将多个单一表达式组成复合表达式,例如:1+1,Python中的数学运算符除了加减乘除(```+-*/```)外还有整除(```//```)取余(```%```)和乘方(```**```),运算顺序遵循数学规则,括号可以改变运算顺序,但注意一律使用小括号。通过这样的层层组合,你可以输入任意数学运算式所对应的表达式,计算机总是会自动计算并返回单一的值。\n",
    "![02_expression.png](http://upload-images.jianshu.io/upload_images/10829283-9659988612b6efd8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n",
    "\n",
    "这个单一的值被称为“物件”或“对象”(Object),对象是一个非常关键的概念,你很快就会发现在Python中“一切皆对象”。每个对象都存在于计算机的内存空间,拥有唯一的编号和确定的类型,你可以用id(对象)来查看它的编号(所在的内存地址),用type(对象)来查看它的类型(所属的“类”名称):\n",
    "```\n",
    ">>> id(1)\n",
    "1756786144\n",
    ">>> id(5%2)\n",
    "1756786144\n",
    ">>> id(2)\n",
    "1756786176\n",
    ">>> type(1)\n",
    "<class 'int'>\n",
    ">>> type(2)\n",
    "<class 'int'>\n",
    ">>> id(1.0)\n",
    "2705425373944\n",
    ">>> type(1.0)\n",
    "<class 'float'>\n",
    "```\n",
    "\n",
    "你可以看到1是整数类型(int),带有小数点的1.0则是浮点类型(float),浮点类型用于表示实数。其实我们还接触过字符串类型(str),在任意长度的字符序列前后加上引号就定义了一个字符串,字符串支持加法(通过连接生成新字符串)和乘法(通过重复生成新字符串):\n",
    "```\n",
    ">>> \"你好\"\n",
    "'你好'\n",
    ">>> \"你好\"+\"世界!\"\n",
    "'你好世界!'\n",
    ">>> \"你好世界!\"*3\n",
    "'你好世界!你好世界!你好世界!'\n",
    ">>> type(\"你好世界!\"*3)\n",
    "<class 'str'>\n",
    "```\n",
    "\n",
    "和数学中一样,你可以用“变量”(Variable)来代表某个数值,这称为变量“赋值”(Assign),变量名可以使用字母(区分大小写)、数字(但不能以数字开头)和下划线,也可以使用任何全角字符包括所有汉字(但建议不要用全角字符)。变量不能和Python语言的关键字重名,否则执行时会报语法错误,你可以输入help(\"keywords\")查看关键字列表。变量赋值语句的基本写法是:变量名=表达式,注意“=”应该读作“赋值”(Python中的等于号是==),一个变量也就是一个单一表达式:\n",
    "```\n",
    ">>> x=1\n",
    ">>> x+2\n",
    "3\n",
    ">>> x,y=1,100  # 同时给多个变量赋值\n",
    ">>> x\n",
    "1\n",
    ">>> y\n",
    "100\n",
    ">>> x=x+1  # x原值加1再赋值给x\n",
    ">>> x\n",
    "2\n",
    ">>> x+=1  # x原值加1再赋值给x的简洁写法\n",
    ">>> x\n",
    "3\n",
    ">>> x,y=y,x  # 对调两个变量所指的对象,其他编程语言基本都需要三条指令才能实现这个操作……\n",
    ">>> x\n",
    "100\n",
    ">>> y\n",
    "3\n",
    ">>> type(x)\n",
    "<class 'int'>\n",
    ">>> x=\"你好世界!\"\n",
    ">>> type(x)\n",
    "<class 'str'>\n",
    "```\n",
    "\n",
    "你可以让两个变量指向同一个对象,也可以用del语句删除已有的变量:\n",
    "```\n",
    ">>> y=x  # 两个变量指向了同一个对象\n",
    ">>> id(x)\n",
    "2565766974768\n",
    ">>> id(y)\n",
    "2565766974768\n",
    ">>> dir()  # 查看当前名称空间的变量\n",
    "['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x', 'y']\n",
    ">>> del y  # 删除已有变量\n",
    ">>> dir()\n",
    "['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']\n",
    ">>> 类型=type  # 汉字也可以用做变量名\n",
    ">>> 类型(x)\n",
    "<class 'str'>\n",
    ">>> 类型(id)\n",
    "<class 'builtin_function_or_method'>\n",
    ">>> 类型(类型)\n",
    "<class 'type'>\n",
    "```\n",
    "\n",
    "现在你可能会猜到了,这些id(1)、type(1),还有我们已经接触过的print(\"Hello World!\")也属于复合表达式,id、type、print也是指向某个对象的变量,这种对象是可以做“调用”(Call)运算的,在Python中分为“函数”(function)、“方法”(method)和“类型”(type)等类型,相当于数学中函数的概念。函数名就相当于运算符,参加运算的表达式放在函数名之后的括号里,称为“参数”(Argument),如果有多个参数就用逗号分隔,而运算的结果就是函数的返回值。例如max函数可以从多个数中找出最大值:\n",
    "```\n",
    ">>> max\n",
    "<built-in function max>\n",
    ">>> max(1,3,9,2)\n",
    "9\n",
    ">>> type(max)\n",
    "<class 'builtin_function_or_method'>\n",
    ">>> type(max(1,3,9,2))\n",
    "<class 'int'>\n",
    "```\n",
    "\n",
    "函数能完成各种复杂的功能。例如之前看到的input函数,可以接受一个字符串参数,执行时会显示此字符串作为提示,然后将用户在按回车键之前输入的全部内容作为字符串返回,也可以写成不带参数的input(),执行时就不显示任何提示。print函数同样可以不带参数,这将输出一个空行;也可以带任意多个参数,这将输出以空格分隔的多个值。注意:print函数输出的内容并不是它的返回值,print函数无返回值——或者可以说print函数返回值为“空”,Python专门定义了一个关键字None来代表空值(类型为NoneType),当返回值为空时不显示任何东西,如果你想强制输出空值,可以print(None):\n",
    "```\n",
    ">>> None\n",
    ">>> print(None)\n",
    "None\n",
    ">>> print(1,2,3)\n",
    "1 2 3\n",
    ">>> print(print(1,2,3))  # 内层print输出三个参数的值,外层print输出内层print返回的空值\n",
    "1 2 3\n",
    "None\n",
    "```\n",
    "\n",
    "总而言之,Python语言中的变量就是贴在对象上的标签,所以它还有一个更笼统的叫法——标识符(Identifier)。变量没有确定的类型,它所指向的对象有确定的类型。在Python关键字以外的任何名称例如print也就是一个指向具体对象的变量而已,你完全可以把它指向别的对象(当然不建议这样做):\n",
    "```\n",
    ">>> p=print  # p和print都指向同一个函数对象\n",
    ">>> p(x)\n",
    "你好世界!\n",
    ">>> print=10  # print指向一个整数对象了\n",
    ">>> print(x)  # 如果尝试调用运算,会提示类型错误“int对象是不能调用的”\n",
    "Traceback (most recent call last):\n",
    "  File \"<pyshell#54>\", line 1, in <module>\n",
    "    print(x)\n",
    "TypeError: 'int' object is not callable\n",
    "```\n",
    "\n",
    "——编程原来是这样……\n",
    "\n",
    "## 编程小提示:Python解释器的源码\n",
    "官方Python解释器是用C语言编写的,称为CPython,你可以在这里查看CPython的源代码 https://github.com/python/cpython  \n",
    "如果你想知道所有内建函数是怎样实现的,可以打开这个C文件,例如其中的builtin_print函数就对应Python中的print函数 https://github.com/python/cpython/blob/master/Python/bltinmodule.c\n",
    "\n",
    "下一篇:[编程入门03:Python模块与库](03_module.ipynb)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}