Pycharm快捷键
Ctrl + Alt + L 格式化代码
Ctrl + / 注释
1. Python语言的特点
2. Python的发展历史与版本
3. Python的安装
4. Python程序的书写规则
# 这是我的第一个Python程序
import time # 我导入了一个时间模块
print(time.time()) # 在屏幕上打印出从1970年1月1日0:00到现在经过了多少秒
if 10 - 9 > 0:
# 这行需要缩进,缩进用4个空格
print('10大于9')
5. 基础数据类型
6. 变量的定义和常用操作
# 网络带宽计算
# print(100/8)
bandwidth = 100
radio = 8
print(bandwidth / radio)
变量命名
7. 序列的概念
解决问题的思路
- 编程中遇到的问题
- 这个问题在现实中我们如何去解决
- 编写相应的代码和进行测试
# 记录生肖,根据年份来判断生肖
chinese_zodiac = '鼠牛虎兔龙蛇马羊猴鸡狗猪'
print(chinese_zodiac[0:4])
# 支持负号的访问
print(chinese_zodiac[-1])
# 列表和元组也可以用这种方式
8.字符串的定义和使用
# 记录生肖,根据年份来判断生肖
chinese_zodiac = '猴鸡狗猪鼠牛虎兔龙蛇马羊'
# print(chinese_zodiac[0:4])
# 支持负号的访问
# print(chinese_zodiac[-1])
# 列表和元组也可以用这种方式
# 基于年份判断生肖
year = 2018
print(year % 12)
print(chinese_zodiac[year % 12])
9.字符串的常用操作
# 记录生肖,根据年份来判断生肖
chinese_zodiac = '猴鸡狗猪鼠牛虎兔龙蛇马羊'
# print(chinese_zodiac[0:4])
# 支持负号的访问
# print(chinese_zodiac[-1])
# 列表和元组也可以用这种方式
# 基于年份判断生肖
year = 2018
print(year % 12)
print(chinese_zodiac[year % 12])
# 成员在字符串中
print('狗' in chinese_zodiac)
print('狗' not in chinese_zodiac)
# 记录生肖,根据年份来判断生肖
chinese_zodiac = '猴鸡狗猪鼠牛虎兔龙蛇马羊'
# print(chinese_zodiac[0:4])
# 支持负号的访问
# print(chinese_zodiac[-1])
# 列表和元组也可以用这种方式
# 基于年份判断生肖
year = 2018
print(year % 12)
print(chinese_zodiac[year % 12])
# 成员在字符串中
print('狗' in chinese_zodiac)
print('狗' not in chinese_zodiac)
print(chinese_zodiac + chinese_zodiac)
print(chinese_zodiac + 'abcd')
print(chinese_zodiac*3)
10.元组的定义和常用操作
不可变更的数据
元组中两个数据的比较
# 小写的u表示unicode编码
zodiac_name = (u'摩羯座', u'水瓶座', u'双鱼座', u'白羊座', u'金牛座', u'双子座',
u'巨蟹座', u'狮子座', u'处女座', u'天秤座', u'天蝎座', u'射手座')
# 月份和日期同时进行存储
zodiac_days = ((1, 20), (2, 19), (3, 21), (4, 21), (5, 21), (6, 22), (7, 23), (8, 23), (9, 23),
(10, 23), (11, 23), (12, 23))
(month, day) = (2, 15)
zodiac_day = filter(lambda x: x <= (month, day), zodiac_days)
# print(zodiac_day)
zodac_len = len(list(zodiac_day))%12
print(zodiac_name[zodac_len])
11.列表的定义和常用操作
# 可以增加和删除元素
a_list = ['abc', 'xyz']
# 增加元素append()
a_list.append('X')
print(a_list)
# 移除元素
a_list.remove('xyz')
print(a_list)
12.条件语句
x = 'abcd'
if x == 'abc':
print('x的值和abc的值相等')
else:
print('x和abc不相等')
# 记录生肖,根据年份来判断生肖
chinese_zodiac = '猴鸡狗猪鼠牛虎兔龙蛇马羊'
# 基于年份判断生肖
year = int(input('请用户输入出生年份:'))
if (chinese_zodiac[year % 12]) == '狗':
print('狗年的运势为。。。')
-
for循环
# 记录生肖,根据年份来判断生肖
chinese_zodiac = '猴鸡狗猪鼠牛虎兔龙蛇马羊'
# 基于年份判断生肖
# year = int(input('请用户输入出生年份:'))
# if (chinese_zodiac[year % 12]) == '狗':
# print('狗年的运势为。。。')
# 遍历字符串
for cz in chinese_zodiac:
print(cz)
for i in range(13):
print(i, end=' ')
print()
for i in range(1, 13):
print(i)
for year in range(2000, 2019):
print('%s年的生肖是%s' % (year, chinese_zodiac[year%12]))
用for循环遍历python中的一个序列
14.while循环
num = 5
while True:
print('a')
num = num + 1
if num > 10:
break
import time
num = 5
while True:
num = num + 1
if num == 10:
continue
print(num)
time.sleep(1)
15.for循环语句中的if嵌套
# 小写的u表示unicode编码
zodiac_name = (u'摩羯座', u'水瓶座', u'双鱼座', u'白羊座', u'金牛座', u'双子座',
u'巨蟹座', u'狮子座', u'处女座', u'天秤座', u'天蝎座', u'射手座')
# 月份和日期同时进行存储
zodiac_days = ((1, 20), (2, 19), (3, 21), (4, 21), (5, 21), (6, 22), (7, 23), (8, 23), (9, 23),
(10, 23), (11, 23), (12, 23))
# 用户输入月份和日期
int_month = int(input("请输入月份:"))
int_day = int(input('请输入日期:'))
for zd_num in range(len(zodiac_days)): # 取出0-11的数值,遍历元组
if zodiac_days[zd_num] >= (int_month, int_day):
print(zodiac_name[zd_num])
break
elif int_month == 12 and int_day > 23:
print(zodiac_name[0])
break
16.while循环语句中的if嵌套
n = 0
while zodiac_days[n] < (int_month, int_day):
n += 1
print(zodiac_name[n])
17.字典的定义和常用操作
dict1 = {}
print(type(dict))
dict2 = {'x': 1, 'y': 2}
dict2['z'] = 3
print(dict2)
# 小写的u表示unicode编码
zodiac_name = (u'摩羯座', u'水瓶座', u'双鱼座', u'白羊座', u'金牛座', u'双子座',
u'巨蟹座', u'狮子座', u'处女座', u'天秤座', u'天蝎座', u'射手座')
# 月份和日期同时进行存储
zodiac_days = ((1, 20), (2, 19), (3, 21), (4, 21), (5, 21), (6, 22), (7, 23), (8, 23), (9, 23),
(10, 23), (11, 23), (12, 23))
chinese_zodiac = '猴鸡狗猪鼠牛虎兔龙蛇马羊'
# 用户输入月份和日期
year = int(input('请输入年份:'))
int_month = int(input("请输入月份:"))
int_day = int(input('请输入日期:'))
n = 0
while zodiac_days[n] < (int_month, int_day):
if int_month == 12 and int_day > 23:
break
n += 1
print(zodiac_name[n])
# 输出生肖和星座
print('%s年的生肖是%s' % (year, chinese_zodiac[year % 12]))
# 小写的u表示unicode编码
zodiac_name = (u'摩羯座', u'水瓶座', u'双鱼座', u'白羊座', u'金牛座', u'双子座',
u'巨蟹座', u'狮子座', u'处女座', u'天秤座', u'天蝎座', u'射手座')
# 月份和日期同时进行存储
zodiac_days = ((1, 20), (2, 19), (3, 21), (4, 21), (5, 21), (6, 22), (7, 23), (8, 23), (9, 23),
(10, 23), (11, 23), (12, 23))
chinese_zodiac = '猴鸡狗猪鼠牛虎兔龙蛇马羊'
cz_num = {}
for i in chinese_zodiac:
cz_num[i] = 0
z_num = {}
for i in zodiac_name:
z_num[i] = 0
while True:
# 用户输入月份和日期
year = int(input('请输入年份:'))
int_month = int(input("请输入月份:"))
int_day = int(input('请输入日期:'))
n = 0
while zodiac_days[n] < (int_month, int_day):
if int_month == 12 and int_day > 23:
break
n += 1
# 输出生肖和星座
print(zodiac_name[n])
print('%s 年的生肖是 %s' % (year, chinese_zodiac[year % 12]))
cz_num[chinese_zodiac[year % 12]] += 1
z_num[zodiac_name[n]] += 1
# 输出生肖和星座的统计信息
for each_key in cz_num.keys():
print('生肖 %s 有 %d' % (each_key, cz_num[each_key]))
for each_key in z_num.keys():
print('星座 %s 有 %d' % (each_key, z_num[each_key]))
18.列表推导式和字典推导式
# 1到10所有偶数的平方
alist = []
for i in range(1, 11):
if i % 2 == 0:
alist.append(i * i)
print(alist)
blist = [i * i for i in range(1, 11) if i % 2 == 0]
print(blist)
z_num = {}
for i in zodizc_name:
z_num[i] = 0
# 将字典中的每一个元素全部赋值为0
z_num = {i: 0 for i in zodizc_name}
19.文件的内建函数
# 将小说的主要人物记录在文件中
# 默认是以只读的方式打开文件
file1 = open('name.txt', 'w')
# open(mode='r')
file1.write('诸葛亮')
file1.close()
# 写入文件 -- 输出
# open() -> write() -> close()
# 读取文件 -- 输入
# open() -> read() -> close()
file2 = open('name.txt')
print(file2.read())
file2.close()
file3 = open('name.txt', 'a')
file3.write('刘备')
file3.close()
20. 文件的常用操作
# 读取一行
file4 = open('name.txt', 'r')
print(file4.readline())
一次读取多行,逐行处理
file5 = open('name.txt')
for line in file5.readlines():
print(line)
print('-------------')
刚开始时文件指针指向文件开头,随着不断处理,指针移动。
tell()
函数可以确定指针的位置
file6 = open('name.txt')
print('当前文件指针的位置%d' % file6.tell())
print('当前读取到了一个字符,字符的内容是 %s' % file6.read(1)) # 只读取文件中的一个字符
print('当前指针的位置%d' % file6.tell())
# 移动到文件开头
file6.seek(0)
print(file6.tell())
file6.read(1)
print(file6.tell())
seek(arg1, arg2)以中间位置进行前后偏移
seek()
第一个参数表示代表偏移位置,第二个参数0表示从文件头开始,1表示从当前位置偏移,2从文件结尾
21. 异常的检测和处理
# NameError命名错误
# i = j
# SyntaxError:invalid syntax 语法错误
# print())
# IndexError
# a = '123'
# print(a[3])
# KeyError
# d = {'a':1, 'b':2}
# print(d['c'])
# 用户输入的错误
# ValueError
# year = int(input("input year:"))
# 根据提示内容的不同进行响应的捕获操作
try:
year = int(input('input year:'))
except ValueError:
print('年份要输入数字')
# AttributeError属性错误
# a = 123
# a.append()
# 可以捕获并输出内容
# 捕获多种异常
# except只能接受一个参数,故将结果组合为一个元组
# except (ValueError, AttributeError, KeyError)
try:
print(1 / 0)
except ZeroDivisionError as c: # 将提示信息重命名为一个变量
print('0不能做除数%s' % c) # 打印错误信息
try:
print(1 / 'a')
except Exception as e: # 捕获所有异常
print('%s' % e) # 输出错误的提示信息
# 自定义错误的提示信息
try:
raise NameError('HelloError')
except NameError:
print('my custom error')
# finally不管是否产生错误都要执行--文件操作
try:
a = open('name.txt')
except Exception as e:
print(e)
finally:
a.close()
22.函数的定义和常用操作
def func(filename):
print(open(filename).read())
print('test func')
func('name.txt')
import re
# 接收名字,返回次数
def find_item(hero):
with open('sanguo.txt', encoding='GB18030') as f:
data = f.read().replace('\n', '')
name_num1 = re.findall(hero, data) # hero在data中出现的次数
# print('主角 %s 出现 %s 次' %(hero, len(name_num1)))
return len(name_num1)
# 读取人物的信息
name_dict = {}
with open('name.txt') as f:
for line in f:
names = line.strip('|')
for n in names:
# print(n)
name_num = find_item(n)
name_dict[n] = name_num
23. 函数的可变长参数
# 用关键字指定参数
print('abc', end='\n\n')
print('abc')
def func(a, b, c):
print("a= %s" % a)
print("b= %s" % b)
print("c= %s" % c)
# 可以忽略顺序,更明确函数调用的意义
func(1, c=3, b=2)
# func(1, c=3)
# 取得参数的个数
def howlong(first, *other):
print(1 + len(other))
howlong(1223)
howlong(123, 234, 456)
24. 函数的变量作用域
var1 = 123
# 函数内部的变量只影响内部的情况
def func():
# var1 = 456
global var1
var1 = 456
print(var1)
func()
print(var1)
25.函数的迭代器与生成器
list1 = [1, 2, 3]
it = iter(list1)
print(next(it)) # next函数取下一个值
print(next(it)) # 输出下一个元素 -- 此处为第二个
print(next(it))
# print(next(it)) -->产生异常
迭代器
# 生成器 -- 带yield的迭代器
# for i in range(10, 20, ):
# print(i)
def frange(start, stop, step):
x = start
while x < stop:
yield x # 生成器,运行到此处会暂停
x += step
for i in frange(10, 20, 0.5):
print(i)
26.lambda表达式
def true(): return true()
true()
lanbda: True
def add(x, y):
return x + y
lambda x, y: x + y
lambda x: x <= (month, day)
def func1(x):
return x <= (month, day)
lambda item: item[1]
def func2(item):
return item[i]
27.python的内建函数
filter(), map(), reduce(), zip()
官方文档
filter()
将满足(函数)条件的迭代器取出来
a = [1, 2, 3, 4, 5, 6, 7] # 利用filter来对列表进行过滤
print(list(filter(lambda x: x > 2, a)))
map()
将多个参数依次进行处理
reduce()
zip()
28.闭包的定义
闭包和装饰器
闭包也是函数
闭包的思想来源于函数的嵌套
def func():
a = 1
b = 2
return a + b
# 外部函数
# 外部函数中的变量a被内部函数引用
def sum(a):
# 内部函数
def add(b):
return a + b
return add
num1 = func()
num2 = sum(2)
print(type(num1))
print(type(num2))
num2 = sum(2)
print(num2(4))
用闭包实现计数器的功能
def counter():
cnt = [0]
def add_one():
cnt[0] += 1
return cnt[0]
return add_one
# 每调用一次加1
num1 = counter()
print(num1)
print(num1())
print(num1())
print(num1())
def counter(FIRST=0):
cnt = [FIRST]
def add_one():
cnt[0] += 1
return cnt[0]
return add_one
# 从FIRST开始
num5 = counter(5)
num10 = counter(10)
print(num5())
print(num5())
print(num5())
print(num10())
print(num10())
29.闭包的使用
def a_line(a, b):
def arg_y(x): # 内部函数引用到了外部变量a,b
return a * x + b
return arg_y
# a = 3, b = 5
# x = 10, y = 35
# line1的类型是arg_y
line1 = a_line(3, 5)
print(line1(10))
print(line1(20)) # 得到新的结果
# 再创建一条新的直线
line2 = a_line(5, 10)
print(line2(10))
print(line2(20))
# 定义一个普通函数来实现此功能
def line_re(a, b, x):
return a * x + b
30.装饰器的定义
在函数中增加相应的功能,又不想增加额外的代码。-- 使用装饰器来实现
time
库sleep()``time()
1970年一月1日到现在时间统计
import time
# print(time.time())
# time.sleep(3)
# print(time.time())
def i_can_sleep():
time.sleep(3)
start_time = time.time()
i_can_sleep()
stop_time = time.time()
print(f'函数运行了{stop_time - start_time}秒')
import time
# print(time.time())
# time.sleep(3)
# print(time.time())
def timer(func):
def wrapper():
start_time = time.time()
func()
stop_time = time.time()
print(f'函数运行了{stop_time - start_time}秒')
return wrapper
# timer为装饰函数
# i_can_sleep为被装饰函数
# 额外的功能可以被封装到封装到装饰函数timer中
@timer
def i_can_sleep():
time.sleep(3)
# 实际上为timer(i_can_sleep())
i_can_sleep()
# 闭包传递的是变量
# 装饰器传递的是函数
31.装饰器的使用
def tips(func):
def nei(a, b):
print('start')
func(a, b)
print('stop')
return nei
@tips
def add(a, b):
print(a + b)
print(add(4, 5))
@tips
def sun(a, b):
print(a - b)
print(sun(3, 4))
给装饰器带上相应的参数,以让其来适应不同的函数
def new_tips(argv):
def tips(func):
def nei(a, b):
print('start %s' % argv)
func(a, b)
print('stop')
return nei
return tips
@new_tips('add')
def add(a, b):
print(a + b)
print(add(4, 5))
@new_tips('sub')
def sub(a, b):
print(a - b)
print(sub(3, 4))
def new_tips(argv):
def tips(func):
def nei(a, b):
print('start %s %s' % (argv, func.__name__))
func(a, b)
print('stop')
return nei
return tips
@new_tips('add_module')
def add(a, b):
print(a + b)
print(add(4, 5))
@new_tips('sub_module')
def sub(a, b):
print(a - b)
print(sub(3, 4))
32.自定义上下文管理器
fd = open('name.txt')
try:
for line in fd:
print(line)
finally:
fd.close()
with open('name.txt') as f:
for line in f:
print(line)
33.模块的定义
import os
import time
time.sleep(2)
time.time()
# 重命名
import matplotlib as m
# m.
# 不推荐
from matplotlib import pylab
from time import sleep
sleep()
my_mod
def print_me():
print('me')
# print_me()
module_test.py
import my_mod as mm
mm.print_me()
34.PEP8编码规范
autopep-8
35.类与实例
面向过程
user1 = {'name': 'tom', 'hp': 100}
user2 = {'name': 'jerry', 'hp': 80}
def print_role(rolename):
print('name is %s, hp is %s' % (rolename['name'], rolename['hp']))
print_role(user1)
面向对象
class Player(object): # 定义一个类
def __init__(self, name, hp):
self.name = name
self.hp = hp
def print_role(self): # 定义一个方法
print('%s : %s' % (self.name, self.hp))
user1 = Player('tom', 100) # 类的实例化
user2 = Player('jerry', 80)
user1.print_role()
user2.print_role()