"""

python基础语法

python- Python是一门效率极高的语言,相对于其他编程语言,用Python编写程序,所使用的代码更少。
- 更容易阅读、调试和扩展。
- 数据科学领域应用非常广泛,有丰富的第三方库,如Numpy,Pandas,Matplotlib,scikit-learn等
- Web开发,游戏开发等

"""

"""
python基本数据类型,字符型,数值型

"""

#python单行注释


"""
python多行注释,
shili

"""

#python字符型
"""
单引号'或双引号"
多行字符串
"""
str1='hello'
str2="python"
str3='''spark
hello
'''
print(str1 + "," + str2 + "," + str3)
print(type(str1))
print(len(str1))

"""
python
"""
#算术运算符 %,//,/,**
"""
1
2
2.3333333333333335
16
"""
print(7%3)
print(7//3)
print(7/3)
print(2**4)

#逻辑运算符 and,or,not
a=10
b=20
print(a and b)
print(a or b)
print(not(a or b))

#成员运算符,in,not in
str4="python"
print("y" in str4)

n1=10
n2=15
print(n1==n2)
print(n1!=n2)
print(n1<n2)
print(n1 > n2)

var=input("please input a number:")
print(type(var))
print(int(var)+2)

score=float(input("请输入考试成绩:"))

if score<60 and score>=0:
    print("成绩不及格")
elif score>=60 and score<80:
    print("成绩良好")
elif score>=80 and score<=100:
    print("成绩优秀")
else:
    print("成绩有误!")
    


#pass语句,占位符
score=80

if score<60:
    pass
else:
    print("及格")
    

#列表
L1=[10,20,'abc','python']

print(L1[0])
print(L1[1])
for i in L1:
    print(i)

#for i in range(10):
#    print(i)

#range函数,生成一个序列
for i in range(10): #10表示stop(取不到)
    print(i,end=" ")
for i in range(5,10): #5表示start,10表示stop(取不到)
    print(i,end=" ")
for i in range(5,10,2): #5表示start,10表示stop(取不到),2代表step
    print(i,end=" ")
    
sum=0

for i in range(1,101):
    sum += i
print("1到100之和:",sum)


i=1;sum=0

while i<=100:
    sum+=i
    i+=1

print("1到100之和:",sum)

#continue
for i in L1:
    if i=='abc':
        continue #跳出本轮循环,继续下一轮循环,直至整个循环结束
    print(i)
    


#常见数据结构
#串
string1="Python"
string1='Python'
print(string1)

#字符串的拼接
string2="basic"
print(string1+string2)
#大小写转换
name="python basic"
print(name.title())
name="Python Basic"
print(name.lower()) #大写转换为小写
print(name.upper()) #小写转换为大写

#\,转义符,\n:换行
string2="\nhadoop"
print(string1+string2)
#r,表示原始字符串
string2=r"\nhadoop"
print(string1+string2)

#列表
L1=[10,20,'abc','python']
print(L1)
#切片标记法
print(L1[0])
print(L1[1:3]) #小于3
print(L1[2:])
#负索引
print(L1[-1])
L2=['hadoop','spark',50]
print(L1+L2)
#[10, 20, 'abc', 'python', 'hadoop', 'spark', 50]
#append
L2.append('docker')
print(L2)
#['hadoop', 'spark', 50, 'docker']
#append与for循环结合创建列表
#L=[1,2,3...,9]
L=[]

for i in range(1,10):
    L.append(i)

print(L)
#[1, 2, 3, 4, 5, 6, 7, 8, 9]
#del,删除
del L2[3]
print(L2)
#['hadoop', 'spark', 50]
#pop,弹出
L2.pop()
print(L2)
#['hadoop', 'spark']
#指定弹出某个元素
L2.pop(0)
print(L2)
#['spark']
#sort,排序
L3=[7,2,3,7,5,6,0,1]
L3.sort()
print(L3)

##############################################################
# sorted,临时排序
L3 = [7, 2, 3, 7, 5, 6, 0, 1]
print(sorted(L3))
print(L3)
#[0, 1, 2, 3, 5, 6, 7, 7]
#[7, 2, 3, 7, 5, 6, 0, 1]
# 降序排列
L3 = [7, 2, 3, 7, 5, 6, 0, 1]
L3.sort(reverse=True)
print(L3)
#[7, 7, 6, 5, 3, 2, 1, 0]
# count,针对某个元素计数
L3.count(7)
2
# 元组
t1 = (20, 10, 'abc', 'python')
print(t1)
#(20, 10, 'abc', 'python')
# 通过索引获取元素
print(t1[0])
print(t1[1:3])
#20
#(10, 'abc')
# 元组的拼接
t2 = (50, 'hadoop', 'spark')
print(t1 + t2)
#(20, 10, 'abc', 'python', 50, 'hadoop', 'spark')
len(t1 + t2)
#7


# 集合
s1 = {1, 2, 3, 4, 4, 5, 2}
print(s1)
#{1, 2, 3, 4, 5}
# 增加一个元素
s1.add(6)
print(s1)
#{1, 2, 3, 4, 5, 6}
# 删除一个元素
s1.remove(4)
print(s1)
#{1, 2, 3, 5, 6}
# 求集合的交集与并集
s2 = {1, 2, 4, 5, 6, 8}

print(s1 & s2)  # 集合的交集
print(s1 | s2)  # 集合的并集
#{1, 2, 5, 6}
#{1, 2, 3, 4, 5, 6, 8}
# set
string1 = "Python"
s1 = set(string1)
print(s1)
#{'P', 't', 'h', 'o', 'y', 'n'}
# 字典
# 创建一个字典-存储一个人的信息
dict1 = {'name': 'zhangsan', 'age': 30, 'city': 'Beijing'}
print(dict1)
#{'name': 'zhangsan', 'age': 30, 'city': 'Beijing'}
# 通过key获取某个元素的value
print(dict1.get('age'))
print(dict1.get('city'))
#30
#Beijing
# 给字典增加一个元素
dict1['gender'] = 'Male'
print(dict1)
#{'name': 'zhangsan', 'age': 30, 'city': 'Beijing', 'gender': 'Male'}
# 修改某个元素的value
dict1['age'] = 35
print(dict1)
#{'name': 'zhangsan', 'age': 35, 'city': 'Beijing', 'gender': 'Male'}
# 删除字典的某个元素
del dict1['gender']
print(dict1)
#{'name': 'zhangsan', 'age': 35, 'city': 'Beijing'}
# items()
dict1.items()
dict_items([('name', 'zhangsan'), ('age', 35), ('city', 'Beijing')])
# 遍历字典
for key, value in dict1.items():
    print(key + ":", end="")
    print(value)
name: zhangsan
age: 35
city: Beijing
for key in dict1.keys():
    print(key)
#name
#age
#city
for value in dict1.values():
    print(value)
#zhangsan
#35
#Beijing
#常用内置序列函数
print(L1)
#[10, 20, 'abc', 'python']
i = 0

for value in L1:
    print(i, value)
    i += 1

# enumerate
for i, value in enumerate(L1):
    print(i, value)

# zip
L1 = ['name', 'age', 'city']
L2 = ['zhangsan', 30, 'Beijing']
list(zip(L1, L2))
#[('name', 'zhangsan'), ('age', 30), ('city', 'Beijing')]
# reverse
for i in reversed(range(10)):
    print(i)

# 列表推导式
'''
Python的特性之一,使我们能够简洁地构造一个列表
'''

L = []

for x in range(5):
    L.append(x)

print(L)
#[0, 1, 2, 3, 4]
# 下面使用列表推导式
[x for x in range(5)]
#[0, 1, 2, 3, 4]
L = []

for x in range(10):
    if x > 5:
        L.append(x)

print(L)
#[6, 7, 8, 9]
[x for x in range(10) if x > 5]
#[6, 7, 8, 9]
# 集合推导式
{x * x for x in range(5)}
#{0, 1, 4, 9, 16}
# 字典推导式
{x: x * x for x in range(5)}
#{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
#函数
# 求绝对值
print(abs(-2))

# 求最大值
print(max(1, 4, 8, -2))

# 调用math下的函数
import math

print(math.sqrt(16))
print(math.ceil(3.2))
print(math.floor(3.2))



# 自定义函数
# 定义一个无参函数
def sayHello():
    print("hello!")


sayHello()
#hello!

# 定义一个求绝对值的函数
def myAbs(x):
    if x >= 0:
        return x
    else:
        return -x


myAbs(-4)
#4


# 匿名函数,lambda
def f1(x):
    return x * x


f1(5)
#25
(lambda x: x * x)(5)
#25


def f2(x, y):
    return x * y


f2(2, 3)

(lambda x, y: x * y)(2, 3)

# 递归函数
# 求阶乘,5!=5*4*3*2*1
'''
5!=fact(5)
5!=5*fact(4)
5!=5*4*fact(3)
5!=5*4*3*fact(2)
5!=5*4*3*2*fact(1)=1
'''


def fact(n):
    if n == 1:  # 递归终止的条件
        return 1
    return n * fact(n - 1)


fact(5)

# 格式化输出
# pip install numpy
import numpy

print(numpy.pi)
#3.141592653589793
print("Pi值:{:.2f}".format(numpy.pi))
#Pi值:3.14
print("大数据技术名词:{}和{}".format('Hadoop', 'Spark'))
#大数据技术名词:Hadoop和Spark
print("大数据技术名词:{1}和{0}".format('Hadoop', 'Spark'))
#大数据技术名词:Spark和Hadoop
print("网站名称:{name},网址:{site}".format(name="Python", site="http://www.python.org"))
#网站名称:Python,网址:http: // www.python.org
#异常

var = float(input("请输入一个数字"))
print(1 / var)
print(2 / 1)
'''
请输入一个数字0
---------------------------------------------------------------------------
ZeroDivisionError
Traceback(most
recent
call
last)
< ipython - input - 30 - 7427
aa59cd30 > in < module >
1
'''
var = float(input("请输入一个数字"))
#----> 2
print(1 / var)
#3
print(2 / 1)
'''
ZeroDivisionError: float
division
by
Zero
'''
# try...except...
try:
    var = float(input("请输入一个数字"))
    print(1 / var)
except ZeroDivisionError:
    print("分母不能为零")
print(2 / 1)
'''
请输入一个数字0
分母不能为零
2.0
'''
# 还可以将异常原因打印出来
try:
    var = float(input("请输入一个数字"))
    print(1 / var)
except ZeroDivisionError as e:
    print("分母不能为零", e)
print(2 / 1)
'''
请输入一个数字0
分母不能为零
float
division
by
zero
2.0
'''
# 多个异常
try:
    var = float(input("请输入一个数字"))
    print(1 / var)
except ZeroDivisionError as e:
    print("分母不能为零", e)
except ValueError as e:
    print("值错误", e)
print(2 / 1)
'''
请输入一个数字p
值错误
could
not convert
string
to
float: 'p'
2.0
'''
# 使用Exception代指所有异常
try:
    var = float(input("请输入一个数字"))
    print(1 / var)
except Exception as e:
    print("出现异常:", e)
print(2 / 1)
'''
请输入一个数字p
出现异常: could
not convert
string
to
float: 'p'
2.0
'''
# finally,最终执行的操作
try:
    var = float(input("请输入一个数字"))
    print(1 / var)
except Exception as e:
    print("出现异常:", e)
finally:
    print("程序执行完毕!")
print(2 / 1)
'''
请输入一个数字p
出现异常: could
not convert
string
to
float: 'p'
程序执行完毕!
2.0
'''
# raise,抛出异常
try:
    var = float(input("请输入一个数字"))
    print(1 / var)
except Exception as e:
    print("出现异常:", e)
    # raise
finally:
    print("程序执行完毕!")
print(2 / 1)
'''
请输入一个数字0
出现异常: float
division
by
zero
程序执行完毕!
2.0
'''
#import语句
import math

math.sqrt(4)

from math import sqrt

sqrt(4)

# 导入多个函数
from math import sqrt, log10

print(sqrt(4))
print(log10(10))

# 给math取一个简短的名称
import math as mm

mm.sqrt(4)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 导入math模块下的所有函数
from math import *

print(sqrt(4))
print(floor(3.8))

import this


#迭代器与生成器
# 可迭代
some_dict = {'a': 1, 'b': 2, 'c': 3}
print(some_dict)
#{'a': 1, 'b': 2, 'c': 3}
for key in some_dict:
    print(key)


'''
迭代器
1、iter(),创建迭代器
2、next()
'''
dict_iterator = iter(some_dict)
print(dict_iterator)
'''
< dict_keyiterator
object
at
0x000002847C8766D8 >
'''
next(dict_iterator)
#'a'
next(dict_iterator)
#'b'
next(dict_iterator)
#'c'
next(dict_iterator)
'''---------------------------------------------------------------------------
StopIteration
Traceback(most
recent
call
last)
< ipython - input - 19 - ef6de0c28fdd > in < module >
----> 1
'''
next(dict_iterator)

'''StopIteration:'''

# 除了通过next函数调用迭代器,还可以通过for循环来调用迭代器
dict_iterator = iter(some_dict)

for i in dict_iterator:
    print(i)

# 生成器
'''
生成器是一种计算机制,指一边循环一边计算
'''

# 列表推导式
L = [x * x for x in range(5)]
print(L)
#[0, 1, 4, 9, 16]
# 创建生成器
g = (x * x for x in range(5))
print(g)
'''
< generator
object < genexpr > at
0x000002846D095308 >
'''
# 调用生成器的第一种方式:next
next(g)
#0
next(g)
#1
# 调用生成器的第二种方式:for循环
for i in g:
    print(i)


# 通过函数创建生成器,yeild

# 定义一个普通的函数:生成一个等差数列
def seq(max):
    x = 1
    d = 2
    while x < max:
        print(x)
        x += d  # x=x+d


seq(20)


# 生成器
def seq_g(max):
    x = 1
    d = 2
    while x < max:
        yield (x)
        x += d  # x=x+d


seq_g(20)
'''
<generator
object
seq_g
at
0x000002847C9E60F8 >
'''

next(seq_g(20))
#1
for i in seq_g(20):
    print(i)


#面向对象


# 定义一个类
class Animal:
    # 通过构造方法定义类的属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 定义类的方法
    def sit(self):
        # 模拟动物被命令坐下这个动作
        print(self.name + " is now sitting.")


# 实例化——通过类得到对象
dog = Animal('Xiaohua', 3)
print(dog.name)
print(dog.age)

dog.sit()

# 实例化——得到其他对象
cat = Animal('Xiaomao', 2)
cat.name
#'Xiaomao'
cat.sit()
#Xiaomao is now
#sitting.


# 继承
class Dog(Animal):
    pass  # 占位符


# 父类:Animal,子类:Dog
jinmao = Dog('Xiaojin', 5)
jinmao.name
#'Xiaojin'
jinmao.sit()
#Xiaojin is now
#sitting.


# 重写
class Dog(Animal):
    def sit(self):
        print(self.name + " is now sitting,My age is %d" % self.age)


hashiqi = Dog('Xiaoha', 2)
hashiqi.name
#'Xiaoha'
hashiqi.sit()
#Xiaoha is now
#sitting, My
#age is 2
# 模块其实也是类
# pip install pandas
from pandas import Series

# 实例化
ser1 = Series(data=[4, 7, -5, 3])
print(ser1.values)
print(ser1.sum())
#[4  7 - 5  3]
#9
# datetime,日期和时间
from datetime import datetime

dt1 = datetime(2019, 1, 1)
print(dt1)

dt2 = datetime(2019, 1, 1, 12, 30, 45)
print(dt2)
#2019 - 01 - 01 00: 00:00
#2019 - 01 - 01 12: 30:45
print(dt2.day)
print(dt2.minute)

print(dt2.date())
#1
#30
#2019 - 01 - 01
# strptime
string_dt = '2019-1-1'
print(type(string_dt))
print(datetime.strptime(string_dt, '%Y-%m-%d'))
#<class 'str'>
#2019 - 01 - 01 00: 00:00


文件读写
# open
file_object = open('data/pi.txt')
# read
contents = file_object.read()
print(contents)


# close
file_object.close()
# with open
with open('data/pi.txt') as file_object:
    contents = file_object.read()
    print(contents)

# readline
file = 'data/pi.txt'

with open(file) as file_object:
    contents = file_object.readline()
    print(contents)

# readlines
file = 'data/pi.txt'

with open(file) as file_object:
    contents = file_object.readlines()
    print(contents)
#['3.1415926535\n', '   8979328346\n', '   2643383279\n']
# strip,去除字符串两端的空格及换行
contents[1]
#'   8979328346\n'
contents[1].strip()
#'8979328346'
L = []

for i in contents:
    L.append(i.strip())

print(L)
#['3.1415926535', '8979328346', '2643383279']
# 写入文件
file = 'data/write.txt'

with open(file, 'w') as file_object:
    file_object.write("I love Python!")
# 写入多行
file = 'data/write1.txt'

with open(file, 'w') as file_object:
    file_object.write("I love Python!\n")
    file_object.write("我爱Python!\n")
# 以追加的方式写入文件
file = 'data/write1.txt'

with open(file, 'a') as file_object:
    file_object.write("I love Python!\n")
    file_object.write("我爱Python!\n")