> For the complete documentation index, see [llms.txt](https://books.innohub.top/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://books.innohub.top/pyinfo/python3-base.md).

# Python3 Base

## 一.在linux下python3 源码的执行：

> ```
> 1.直接运行python3 file 
> 2.在代码前添加解释器路径 #！/usr/bin/python3     再修改文件的执行权限  chomd +x file.py  可  以直接运行PYHTON源码
>            可以在代码中添加该行，使用方式1 时该语句相当于注释
> ```

## 二.基础语法

### 1.编码

```
  python3 默认以UTF-8为编码方式存储字符串，所有字符串都是Unicode字符串，也可指定编码方式
  # -*- coding: cp-1252 -*-

  对于python2.x：
  # -*- coding:utf-8 -*-
   su = "人生欢乐" #su是一个utf-8格式的字节串
   u  = s.decode("utf-8") #  s被解码为unicode对象，赋给u
   sg = u.encode("gbk") # u被编码为gbk格式的字节串，赋给sg
   print sg
```

![image](https://github.com/kobeHub/Hello-world/blob/master/pic/1.png)

```
 Note: 
 1)制定编码方式为utf-8  存储的是字节码 需要解码(decode)为unicode对象<class 'unicode'>，再进行编码为其他格式此时类型为<class 'str'>
 2)不能直接输出decode结果：u = s.decode("utf-8"); print u; 要encode后输出。
   如果需要转换字符串编码方式，可以对字符串对象先进行
 3)x 想要查看字符串各种编码序列，只能通过encode转化成bytes类型，然后输出。str是标准形式没办法直接查看其字节序列。。
   通过urllib.parse.quote 将字节序列转化成url的中文编码形式，逆过程是unquote函数。
```

### 2.注释与缩进

```
  1)单行注释以#，多行注释可以使用三引号'''  '''  或   """    """
  2)python最具特色的就是使用缩进来表示代码块，不需要使用大括号 {} 。
  3)缩进的空格数是可变的，但是同一个代码块的语句必须包含相同的缩进空格数。
  4)一个语句可以写多行   以反斜杠链接
    total = item1+\
           item2+\
           item3
      在[] {} () 中的多行语句不需要反斜杠
```

### 3.基本数据结构

![image](https://github.com/kobeHub/Hello-world/blob/master/pic/pyData.png)

\=======

### 4.序列对象  string list tuple

```python
#!/usr/bin/python3
# -*-coding:utf-8-*-
"""
字符串、列表、元组均属于序列
string、list和tuple都属于sequence（序列）
其取值操作一致
对任一sequence对象cha[i:j] 表示将cha的下标为i到j-1的元素复制形成一个新的序列对象
i缺省值为0，j缺省值为char.length
索引有两种方式：
从左到右是从0开始，从右到左从-1 开始

cha[i:j:s]   表示将序列进行复制后，再次以s为进位大小进行复制形成新的序列对象

"""

"""
关于print函数，可以输出多个不同对象，若以逗号隔开，则在同一行输出，并且每个对象间相隔一个空格
默认换行，若不换行，则添加end=""  其e中的内容是输出结束后附加输出的内容
"""
print('%ls' % 'Now test the \'str\' \'list\' \'tuple\'')
str1 = 'Rose is a beautiful girl'  # string 对象元素不可更改
list1 = ['Mark', 651532, True, 'Jack']  # list中元素可变，类似于栈顶在尾部的栈，可以进行赋值操作
tuple1 = ()  # 可以以这种方式创建一个空的元组
tuple3 = (785,)  # 创建单元元组必须后面加逗号
tuple2 = ('Great', 65313, True, 'Amazing')  # 元组中元素不可变，

print(str1), print(list1), print(tuple1), print(tuple3), print(tuple2)

print("输出字符串的某个元素：", end='\n')
print(str1[0], str1[-1], str1[-10])
print("倒序输出：\n"+str1[::-1])

print("\n\n列表操作：")
print('list:', list1)
print('First ele and last ele:', list1[0], list1[-1])
print('Reverse:', list1[::-1])
print('pop:', list1.pop())
print('Append 655:', list1.append(655), list1)


print('\n\n')
```

#### 运行结果：

![image](https://github.com/kobeHub/Hello-world/blob/master/pic/test.png)

\=======

#### 补充说明：

```
1.如果一个函数要返回多个值时，要以元组形式返回
   例如：
    del example(a, b)
              return (a, b)
    type(example(a, b))
    <class, 'tuple'>
2.python中的函数还可以接收可变长参数，比如以 "*" 开头的的参数名，会将所有的参数收集到一个元组上。
    例如：
        def test(*args):
            print(args)
            return args

        print(type(test(1,2,3,4)))    #可以看见其函数的返回值是一个元组
```

```
3.字典的输出
```

```
可以通过遍历字典中所有元素的键值输出字典
def example(dict)
     for c in dict
         print(c)  # 输出的是所有键值以及值的元组形式
不可以这样遍历所有元素:
     {print(c, ':', dict[c]) ~~  ## 字典中的单个元素是以二元元组存储的，故dict[c]报错}#{错误}

使用 字典的内置items()函数
for k,v in dict.items():
    print(k, ':', v)
  k,v也可以写作序列组的形式，即写作列表[k, v]  元组(k, v)  但是不能写作集合的形式，因为集合中不允许有重复元素，而字典的键值和值可能相等
```

### 5.集合(set)与字典(dictionary)

```
     集合是一个无重复元素的的特殊序列，基本功能是进行成员关系测试和删除重复元素。可以使用大括号 { } 或者 set() 函数创建集合，
    注意：创建一个空集合必须用 set() 而不是 { }，因为 { } 是用来创建一个空字典。
```

#### 创建方式：

```python
parame = {value01,value02,...}
pa = set(value)  # 一般使用set函数是，传入一个字符串，讲每个字符作为集合的元素，去掉重复即可形成集合
```

#### 集合的基本操作：

```python
#!/usr/bin/python3

student = {'Tom', 'Jim', 'Mary', 'Tom', 'Jack', 'Rose'}

print(student)   # 输出集合，重复的元素被自动去掉

# 成员测试
if('Rose' in student) :
    print('Rose 在集合中')
else :
    print('Rose 不在集合中')


# set可以进行集合运算
a = set('abracadabra')
b = set('alacazam')

print(a)

print(a - b)     # a和b的差集

print(a | b)     # a和b的并集

print(a & b)     # a和b的交集

print(a ^ b)     # a和b中不同时存在的元素
```

```
   字典（dictionary）是Python中另一个非常有用的内置数据类型。列表是有序的对象结合，字典是无序的对象集合。
两者之间的区别在于：字典当中的元素是通过键来存取的，而不是通过偏移存取。
字典是一种映射类型，字典用"{ }"标识，它是一个无序的键(key) : 值(value)对集合。
键(key)必须使用不可变类型。
在同一个字典中，键(key)必须是唯一的。
```

#### 字典的创建方式

```python
dict = {}  # 创建空字典
dict['one'] = "The choosen"  # 向字典中添加一个元素
dict[2]     = "Guy"  # 现在字典中包含两个元素

tinydict = {'name': 'runoob','code':1, 'site': 'www.runoob.com‘}  # 直接创建，key 与 value 之间用冒号隔开

dict1 = dict([('Runoob', 1), ('Google', 2), ('Taobao', 3)])  # 利用dict函数创建

“”“
字典是二元有序序列(sequence)的无序不重复序列：具有以下形式
>>> dict_1 = dict([('a',1),('b',2),('c',3)]) #元素为元组的列表
>>> dict_1
   ': 1, 'b': 2, 'c': 3}
>>> dict_2 = dict({('a',1),('b',2),('c',3)})#元素为元组的集合
>>> dict_2
   ': 2, 'c': 3, 'a': 1}
>>> dict_3 = dict([['a',1],['b',2],['c',3]])#元素为列表的列表
>>> dict_3
   ': 1, 'b': 2, 'c': 3}
>>> dict_4 = dict((('a',1),('b',2),('c',3)))#元素为元组的元组
>>> dict_4   
>>> {'a': 1, 'b': 2, 'c': 3}
```

## 三. 运算、数据及逻辑

### 1.算数运算符

​ 变量a为10，变量b为21：

| 运算符  | 描述                         | 实例                |
| ---- | -------------------------- | ----------------- |
| +    | 两个对象相加                     | a+b = 31          |
| -    | 得到负数或者减去另一个数               | a-b = -11         |
| \*   | 两个字相乘得到的返回值，或者是一个序列重复若干次输出 | a\*b = 210        |
| /    | 除法运算，默认得到浮点结果，注意格式化输出      | b/a = 2.1         |
| %    | 取模运算                       | b%a = 1           |
| \*\* | 返回x的y次幂u                   | a\*\*b 结果为10的21次幂 |
| //   | 整除，返回商的整数部分                | a//b = 2          |

**对应的赋值运算符：**

| 运算符   | 描述       | 实例                           |
| ----- | -------- | ---------------------------- |
| =     | 简单的赋值运算符 | c = a + b 将 a + b 的运算结果赋值为 c |
| +=    | 加法赋值运算符  | c += a 等效于 c = c + a         |
| -=    | 减法赋值运算符  | c -= a 等效于 c = c - a         |
| \*=   | 乘法赋值运算符  | c *= a 等效于 c = c* a          |
| /=    | 除法赋值运算符  | c /= a 等效于 c = c / a         |
| %=    | 取模赋值运算符  | c %= a 等效于 c = c % a         |
| \*\*= | 幂赋值运算符   | c **= a 等效于 c = c** a        |
| //=   | 取整除赋值运算符 | c //= a 等效于 c = c // a       |

```python
a = 21
b = 10
c = 0

c = a + b
print ("1 - c 的值为：", c)

c += a
print ("2 - c 的值为：", c)

c *= a
print ("3 - c 的值为：", c)

c /= a 
print ("4 - c 的值为：", c)

c = 2
c %= a
print ("5 - c 的值为：", c)

c **= a
print ("6 - c 的值为：", c)

c //= a
print ("7 - c 的值为：", c)
```

> 输出结果：
>
> ```
> 1 - c 的值为： 31
> 2 - c 的值为： 52
> 3 - c 的值为： 1092
> 4 - c 的值为： 52.0
> 5 - c 的值为： 2
> 6 - c 的值为： 2097152
> 7 - c 的值为： 99864
> ```

### 2.python的位运算符

```
     python的位运算符是把数字当做二进制数来运算的，数字可以以任一进制输入，但是进行位运算时以二进制形式。注意默认输出是以十进制形式，进行输出时，可以采用以下函数：
bin()    采用二进制
oct()    八进制
hex()    十六进制


输入时：
2 进制是以 0b 开头的: 例如: 0b11 则表示十进制的 3
8 进制是以 0o 开头的: 例如: 0o11 则表示十进制的 9
16 进制是以 0x 开头的: 例如: 0x11 则表示十进制的 17
```

| 运算符 | 描述                                                                |
| --- | ----------------------------------------------------------------- |
| &   | <p>按位与运算符：<br>           参与运算的两个值每一位进行“与运算”，得到结果以二进制表示\</br ></p> |
| \|  | <p>按位或运算符：<br>           每一位进行逻辑或运算，即二个位置中有1即为1</p>               |
| ^   | <p>按位异或逻辑符：<br>           对应位置不同时结果相应位置为1</p>                     |
| \~  | <p>按位取反逻辑符：<br>           对数据的每个位二进制位取反，\~x 类似于 -x-1</p>          |
| <<  | <p>左移逻辑符：<br>           进行左移操作，右边参数为左移位数，每左移一位，数值扩大二倍</p>         |
| >>  | <p>右移逻辑运算符：<br>           进行右移操作，每右移一位，原数值相当于缩小一半</p>             |

### 3.逻辑运算符、成员及身份运算符

#### 1）逻辑运算符

```
    逻辑运算符包括 and or not
    运算规则如下：
        x and y:
            if x==false   return false;
            else    return y;
        x or y:
            if x==true    return x;
            else    return y;
        not x:
            return -x
```

**注意：**

x和y可以是字符串对象或者数字，其中0和“”为假，其他为真。逻辑运算符可以连接多个对象，则and返回值为第一个为假的值，若所有只为真则返回最后一个值；or返回第一个为真的的值，所有值为假则返回最后一值，即逻辑运算需要遍历参加运算的每一个对象

#### 2）成员运算符

```
in:    若在指定序列中找到该值则返回True  否则返回False
not in：与in作用相反
```

#### 3）身份运算符

```
is：判断两个标识符是否是同一对象的引用，是则返回True
not is：---
函数id() 用于获取对象的内存地址，is 的用法x is y与id(x) == id(y)方式等价

is与==的区别：
    is用于判断是否是同一对象的不同引用，而==用于比较对象的值是否相等

python具有intern机制在交互式环境中，会有一个小整数池对象，将[-5,256]这些整数对象，提前分配好空间，所有位于这个范围的引用公用一个对象，所以会出现：
    a = 7; b = 7
    (a is b) == True
```
