一。collections

  collections模块中提供了除了dict,list,str等数据类型之外的其他数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等

    1.namedtuple: 生成可以使用名字来访问元素内容的tuple

    2.deque: 双端队列,可以快速的从另外一侧追加和推出对象

    3.Counter: 计数器,主要用来计数

    4.OrderedDict: 有序字典

    5.defaultdict: 带有默认值的字典

  1.namedtuple具名元组

  普通的元组不具有描述自己定义的数据的功能,而具名元组定义了一个可以描述元组的数据类型:

  1. from collections import namedtuple
  2. point = namedtuple('坐标',['x','y','z'])
  3. p = point(1,2,5)
  4. print(p)
  5. print(type(p))
  6. print(p.x)
  7. print(p.y)
  8. print(p.z)
  9. #输出结果>>>坐标(x=1, y=2, z=5)
  10. #<class '__main__.坐标'>
  11. #
  12. #
  13. #

  导入模块后,可以使用namedtuple调用函数,namedtuple可以传入两个参数,第一个是对元组的描述,第二个是可迭代对象,所以,除了列表,还可以写成这样:

  1. point = namedtuple('坐标','x y z')

  注意,参数与参数之间需要使用空格隔开。

  定义好一个具名元组后,就可以对其进行传参了,传入的参数要与可迭代中的元素一样。

  2.deque

  补充:queue队列模块

  1. # import queue
  2. # q = queue.Queue()
  3. # q.put('first')
  4. # q.put('second')
  5. # q.put('third')
  6. # print(q.get())
  7. # print(q.get())
  8. # print(q.get())
  9. # print(q.get())
  10. #输出结果>>>first
  11. #second
  12. #third

  使用queue模块创建一个队列q,再使用put方法对其传值,使用get对其取值,当值被取完时继续调用get方法,等待列表给值。

  deque双端队列,是一个两边都可以取值和传值的队列。

  1. from collections import deque
  2. q = deque(['a','b','c'])
  3. q.append('x')
  4. print(q)
  5. q.appendleft('y')
  6. print(q)
  7. q.pop()
  8. print(q)
  9. q.popleft()
  10. print(q)
  11. #输出结果>>>deque(['a', 'b', 'c', 'x'])
  12. #deque(['y', 'a', 'b', 'c', 'x'])
  13. #deque(['y', 'a', 'b', 'c'])
  14. #deque(['a', 'b', 'c'])

  在deque中可以使用append和appendleft对队列进行左右 的加值,pop和popleft对其进行左右的删值。deque传值是传可迭代对象。

  在双端队列中可以使用insert对其进行索引取值,这是deque不合理的地方。

  3.Ordereddict有序字典

  在正常定义一个字典时,产生的字典是无序的,而使用ordereddict产生的字典是有序的。有序字典的定义方式是:

  1. order_d = OrderedDict([('a',1),('b',2),('c',3)])

  其输出也是这个,并不会以无序字典的方式打印,或者

  1. order_d1 = OrderedDict()
  2. order_d1['x'] = 1
  3. order_d1['y'] = 2
  4. order_d1['z'] = 3
  5. print(order_d1)
  6. for i in order_d1:
  7. print(i)
  8. print(order_d1)

  这个字典是可以使用for循环遍历取值的。使用keys()对其进行取值时会按照插入顺序,而不是key本身的顺序。

  4.defaultdict默认字典

  当你需要把列表中的值进行判断大小(66),,并对其值放入字典中,字典的value是一个列表,不用defaultdict可以使用如下办法。

  1. values = [11, 22, 33,44,55,66,77,88,99,90]
  2. my_dict = {}
  3. for value in values:
  4. if value>66:
  5. if my_dict.has_key('k1'):
  6. my_dict['k1'].append(value)
  7. else:
  8. my_dict['k1'] = [value]
  9. else:
  10. if my_dict.has_key('k2'):
  11. my_dict['k2'].append(value)
  12. else:
  13. my_dict['k2'] = [value]

  而使用了defaultdict()方法后x,对其传入一个数据类型,当字典被创建后,其value会被自动转换成传入的那个数据类型,所以上述题目可以简化成:

  1. from collections import defaultdict
  2. values = [11, 22, 33,44,55,66,77,88,99,90]
  3. my_dict = defaultdict(list)
  4. for value in values:
  5. if value>66:
  6. my_dict['k1'].append(value)
  7. else:
  8. my_dict['k2'].append(value)

  使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict

  1. >>> from collections import defaultdict
  2. >>> dd = defaultdict(lambda: 'N/A')
  3. >>> dd['key1'] = 'abc'
  4. >>> dd['key1'] # key1存在
  5. 'abc'
  6. >>> dd['key2'] # key2不存在,返回默认值
  7. 'N/A'

5.Counter计数

  当你需要统计一个字符串中某个字符出现的次数时,如题

  1. s='aaaaabbbbbbvcccccc'
  2. dict1=dict({})
  3. for i in s:
  4. if i not in dict1:
  5. dict1[i]=1
  6. else:
  7. dict1[i]+=1
  8. print(dict1)
  9. #输出结果>>>{'a': 5, 'b': 6, 'v': 1, 'c': 6}

  而使用counter计数就可以直接生成字典:

  1. from collections import Counter
  2. s = 'abcdeabcdabcaba'
  3. res = Counter(s)
  4. print(res)
  5. #输出结果>>>Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})

二。time时间模块

  时间模块有三种表现形式:

  1.时间戳

  2.格式化时间(用来展示给人看的)

  3.结构化时间 

  1.time.time()

  1. import time
  2. print(time.time())
  3. #输出结果>>>1563445995.928969

  输出的是现在的时间距离1970-1-1的秒数,

  2.strftime()

  格式化时间输出的时间比较工整,它与%s差不多,不过有特定的符号接受年月日、

  1. print(time.strftime('%Y-%m-%d'))
  2. print(time.strftime('%Y-%m-%d %H:%M:%S'))
  3. #输出结果>>>2019-07-18
  4. #2019-07-18 18:43:16

  如上,月和日的字符是小写,其他均为大写,使用%X可以代表时分秒。

  在strftime中还有其他的特殊字符,日后用作翻阅如:

  1. %y 两位数的年份表示(00-99
  2. %Y 四位数的年份表示(000-9999
  3. %m 月份(01-12
  4. %d 月内中的一天(0-31
  5. %H 24小时制小时数(0-23
  6. %I 12小时制小时数(01-12
  7. %M 分钟数(00=59
  8. %S 秒(00-59
  9. %a 本地简化星期名称
  10. %A 本地完整星期名称
  11. %b 本地简化的月份名称
  12. %B 本地完整的月份名称
  13. %c 本地相应的日期表示和时间表示
  14. %j 年内的一天(001-366
  15. %p 本地A.M.或P.M.的等价符
  16. %U 一年中的星期数(00-53)星期天为星期的开始
  17. %w 星期(0-6),星期天为星期的开始
  18. %W 一年中的星期数(00-53)星期一为星期的开始
  19. %x 本地相应的日期表示
  20. %X 本地相应的时间表示
  21. %Z 当前时区的名称
  22. %% %号本身

  3.结构化时间

  使用time.local可以打印结构化时间,

  1. print(time.localtime())
  2. #输出结果>>>time.struct_time(tm_year=2019, tm_mon=7, tm_mday=18, tm_hour=18, tm_min=51, tm_sec=5, tm_wday=3, tm_yday=199, tm_isdst=0)

  结构化时间中分别代表了以下值,用做以后索引:

索引(Index) 属性(Attribute) 值(Values)
0 tm_year(年) 比如2011
1 tm_mon(月) 1 - 12
2 tm_mday(日) 1 - 31
3 tm_hour(时) 0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 60
6 tm_wday(weekday) 0 - 6(0表示周一)
7 tm_yday(一年中的第几天) 1 - 366
8 tm_isdst(是否是夏令时) 默认为0

  初次之外,字符串时间,结构化时间,格式化时间之间是可以互相转换的:

  时间戳转化为结构化时间:

  1. print(time.localtime(time.time()))
  2. #输出结果>>>time.struct_time(tm_year=2019, tm_mon=7, tm_mday=18, tm_hour=19, tm_min=13, tm_sec=1, tm_wday=3, tm_yday=199, tm_isdst=0)

  或者转换为伦敦时间:

  1. print(time.gmtime(time.time()))
  2. #输出结果>>>time.struct_time(tm_year=2019, tm_mon=7, tm_mday=18, tm_hour=11, tm_min=15, tm_sec=12, tm_wday=3, tm_yday=199, tm_isdst=0)

  结构化时间转换为时间戳:

  1. res = time.localtime(time.time())
  2. print(time.time())
  3. print(time.mktime(res))
  4. #输出结果>>>1563448581.7627177
  5. #1563448581.0

  结构化时间转换为字符串时间:

  1. print(time.strftime('%Y-%m',time.localtime()))
  2. #输出结果>>>2019-07

  字符串时间转换为结构化时间:

  1. print(time.strptime(time.strftime('%Y-%m',time.localtime()),'%Y-%m'))
  2. #输出结果>>>time.struct_time(tm_year=2019, tm_mon=7, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=182, tm_isdst=-1)

  结构化时间转换成格式化串:

  1. print(time.asctime(time.localtime(1500000000)))
  2. print(time.asctime())
  3. #输出结果>>>Fri Jul 14 10:40:00 2017
  4. #Thu Jul 18 19:27:51 2019

  如果不传值,显示的是当前时间

  时间戳转化成格式化串

  1. print(time.ctime())
  2. print(time.ctime(1500000000))
  3. #输出结果>>>Thu Jul 18 19:29:23 2019
  4. #Fri Jul 14 10:40:00 2017

  time.sleep(n)

  将程序搁置n秒

  datetime模块

  显示年月日和年月日时分秒:

  1. import datetime
  2. print(datetime.date.today())
  3. print(datetime.datetime.today())
  4. #输出结果>>>2019-07-18
  5. #2019-07-18 19:33:33.857248

  下面还有一些获取时间相关的方法:

  1. import datetime
  2. print(datetime.date.today()) # date>>>:年月日
  3. print(datetime.datetime.today()) # datetime>>>:年月日 时分秒
  4. res = datetime.date.today()
  5. res1 = datetime.datetime.today()
  6. print(res.year)
  7. print(res.month)
  8. print(res.day)
  9. print(res.weekday()) # 0-6表示星期 0表示周一
  10. print(res.isoweekday())
  11. #输出结果>>>2019-07-18
  12. #2019-07-18 19:38:59.237848
  13. #
  14. #
  15. #
  16. #
  17. #

  其中,year获取年,month代表月,day代表日,weekday代表星期,但这里从0开始,代表星期一,isoweekday是代表真正的星期。

  在这个模块可以对时间进行计算

  1. timetel_t = datetime.timedelta(days=7) # timedelta对象
  2. print(timetel_t)
  3. #输出结果>>>7 days, 0:00:00

  timedelta是一个时间增量,在进行时间运算时,遵循以下规则:

  日期对象 = 日期对象 +/- timedelta对象

  timedelta对象 = 日期对象 +/- 日期对象,如:

  1. current_time = datetime.date.today() # 日期对象
  2. timetel_t = datetime.timedelta(days=7) # timedelta对象
  3. print(timetel_t)
  4. res1 = current_time+timetel_t # 日期对象
  5. print(current_time - timetel_t)
  6. print(res1-current_time)
  7. #输出结果>>>7 days, 0:00:00
  8. #2019-07-11
  9. #7 days, 0:00:00

  utc时间

  1. dt_today = datetime.datetime.today()
  2. dt_now = datetime.datetime.now()
  3. dt_utcnow = datetime.datetime.utcnow()
  4. print(dt_today)
  5. print(dt_now)
  6. print(dt_utcnow)
  7. #输出结果>>>2019-07-18 19:56:12.536702
  8. #2019-07-18 19:56:12.536702
  9. #2019-07-18 11:56:12.536702

三。random模块

  random是获取随机数等随机项的模块

  如:random.randint(x,y)随机生成x到y之间的数

  random.random()随机生成0-1之间的小数。

  random.shuffle()对一个列表进行随机打乱。

  random.choice()对一个列表中的元素进行随机选择。

  1. import random
  2. print(random.randint(1,6)) # 随机取一个你提供的整数范围内的数字 包含首尾
  3. print(random.random()) # 随机取0-1之间小数
  4. print(random.choice([1,2,3,4,5,6])) # 摇号 随机从列表中取一个元素
  5. res = [1,2,3,4,5,6]
  6. random.shuffle(res) # 洗牌
  7. print(res)
  8. #输出结果>>>4
  9. #0.394731321911586
  10. #
  11. #[2, 1, 5, 3, 6, 4]

  小练习:生成n、位随机验证码,带有数字,大写字母和小写字母

  1. def get_code(n):
  2. code = ''
  3. for i in range(n):
  4. # 先生成随机的大写字母 小写字母 数字
  5. upper_str = chr(random.randint(65,90))
  6. lower_str = chr(random.randint(97,122))
  7. random_int = str(random.randint(0,9))
  8. # 从上面三个中随机选择一个作为随机验证码的某一位
  9. code += random.choice([upper_str,lower_str,random_int])
  10. return code
  11. res = get_code(4)
  12. print(res)

四。os模块

  os模块是与操作系统进行对接的模块

  os.path.dirname(__file__) 获取该文件的上一层文件名

  os.path.join(x,y) 拼接地址

  os.listdir() 将该文件夹下的所有文件读取出看来,成为一个列表。

  os.mkdir('文件夹名'),生成一个文件夹,在当文件夹下

  os.path.exists()判断文件夹是否存在

  os.path.isfile(),判断文件是否存在,不能判断文件夹。

  os.rmdir(''),删除文件夹,(只能删除空文件夹)。

  os.chdir(''),切换到该目录里

  os.getcwd(),查看当前目录

  os.path.getsize(),获取文件大小,获取的是字节

  其他可能用到的如下:

  1. os.makedirs('dirname1/dirname2') 可生成多层递归目录
  2. os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
  3. os.mkdir('dirname') 生成单级目录;相当于shellmkdir dirname
  4. os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shellrmdir dirname
  5. os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
  6. os.remove() 删除一个文件
  7. os.rename("oldname","newname") 重命名文件/目录
  8. os.stat('path/filename') 获取文件/目录信息
  9.  
  10. os.system("bash command") 运行shell命令,直接显示
  11. os.popen("bash command).read() 运行shell命令,获取执行结果
  12. os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
  13. os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
  14.  
  15. os.path
  16. os.path.abspath(path) 返回path规范化的绝对路径
  17. os.path.split(path) 将path分割成目录和文件名二元组返回
  18. os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
  19. os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
  20. os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
  21. os.path.isabs(path) 如果path是绝对路径,返回True
  22. os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
  23. os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
  24. os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
  25. os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间
  26. os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
  27. os.path.getsize(path) 返回path的大小

五。sys模块

  sys模块是与python解释器打交道的

  sys.path.append(),将某个路径添加到系统环境变量的。

  sys.argv:在终端运行该文件可以获取终端输入的内容。并生成列表。

  其他内容:

  1. sys.argv 命令行参数List,第一个元素是程序本身路径
  2. sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
  3. sys.version 获取Python解释程序的版本信息
  4. sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
  5. sys.platform 返回操作系统平台名称

六。序列化模块

  序列:字符串

  序列化:其他数据类型转换成字符串的过程。 

  写入文件的数据必须是字符串,基于网络传输的数据必须是二进制

  反序列化:字符串转化成其他数据类型。

  在数据传输过程中都是以二进制传输,而且在不同语言之间需要进行序列和反序列,所有有一个模块可以进行之间的转化。

  json模块

  json是所有语言都支持的模块。

  json支持的数据类型比较少,如:字符串,列表,字典,整型,元组(转成列表)

  pickle模块

  pickle与json不同的是它只支持python的转化,但能转化所有数字类型

  在存数据如文件是,必须要经序列化。

  json.encoder,可以查询json中支持哪些数据类型的序列化

  1. +-------------------+---------------+
    | Python | JSON |
    +===================+===============+
    | dict | object |
    +-------------------+---------------+
    | list, tuple | array |
    +-------------------+---------------+
    | str | string |
    +-------------------+---------------+
    | int, float | number |
    +-------------------+---------------+
    | True | true |
    +-------------------+---------------+
    | False | false |
    +-------------------+---------------+
    | None | null |
    +-------------------+---------------+

  除此之外其他都不支持,

  1. d = {"name":"jason"}
  2. print(d)
  3. res = json.dumps(d)
  4. print(res,type(res))
  5. res1 = json.loads(res)
  6. print(res1,type(res1))
  7. #输出结果>>>{'name': 'jason'}
  8. #{"name": "jason"} <class 'str'>
  9. #{'name': 'jason'} <class 'dict'>

  在json模块中,damps可以将字典转化成字典型的字符串,而loads可以将字典型的字符串转化成字典。

  dump和load

  1. import json
  2. f = open('json_file','w')
  3. dic = {'k1':'v1','k2':'v2','k3':'v3'}
  4. json.dump(dic,f)
  5. f.close()
  6. f = open('json_file')
  7. dic2 = json.load(f)
  8. f.close()
  9. print(type(dic2),dic2)

  dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件,而load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回。

  注意,在使用dump写入数据到文件中时,是不加空格的,所以要想写入多条数据可以使用dumps手动拼接回车符接在后面,在使用loads返回一行,循环。

  1. d1 = {'name':'朱志坚'}
  2. print(json.dumps(d1,ensure_ascii=False))
  3. #输出结果>>>{"name": "朱志坚"}

  当使用dumps序列化时,可能会把其中的ascii码进行二进制转化,为了避免这种情况,可以使用ensure_ascii取false值使得其不转码。

  pickle模块

  在pickle模块中dumps方法会直接将对象转换成二进制,loads将其转换成原类型。

  在dump方法的使用中,文件的打开模式必须时b模式。

七。subprocess子进程

  sub  子

  process 进程

   其中obj=subprocess.popen('文件名'shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

  使用obj.stdout.read().decode("gbk')进行输出正确的指令进程

  使用obj.stderr.read()输出错误的指令

  1. while True:
  2. cmd = input('cmd>>>:').strip()
  3. import subprocess
  4. obj = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
  5. # print(obj)
  6. print('正确命令返回的结果stdout',obj.stdout.read().decode('gbk'))
  7. print('错误命令返回的提示信息stderr',obj.stderr.read().decode('gbk'))

  其应用范围是可以全程连接其他电脑,使用这个模块获取用户命令,执行命令,就实现了远程操作。

day16_7.18 常用模块的更多相关文章

  1. 十八. Python基础(18)常用模块

    十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...

  2. 18 常用模块 random shutil shevle logging sys.stdin/out/err

    random:随机数 (0, 1) 小数:random.random() ***[1, 10] 整数:random.randint(1, 10) *****[1, 10) 整数:random.rand ...

  3. Day 18 常用模块(二)

    一.随机数:RANDOM 1.(0,1)小数:random.random() 2.[1,10]整数:random.randint(1,10) 3.[1,10)整数:random.randrang(1, ...

  4. 进击的Python【第五章】:Python的高级应用(二)常用模块

    Python的高级应用(二)常用模块学习 本章学习要点: Python模块的定义 time &datetime模块 random模块 os模块 sys模块 shutil模块 ConfigPar ...

  5. Python模块之常用模块,反射以及正则表达式

    常用模块  1. OS模块 用于提供系统级别的操作,系统目录,文件,路径,环境变量等 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("di ...

  6. python学习笔记之常用模块(第五天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

  7. day--6_python常用模块

    常用模块: time和datetime shutil模块 radom string shelve模块 xml处理 configparser处理 hashlib subprocess logging模块 ...

  8. Tengine 常用模块使用介绍

    Tengine 和 Nginx Tengine简介 从2011年12月开始:Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能 和特性. ...

  9. Ansible简介及常用模块

    一.基础介绍 1.简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置. ...

随机推荐

  1. 《HBase在滴滴出行的应用场景和最佳实践》

    HBase在滴滴出行的应用场景和最佳实践   背景 对接业务类型 HBase是建立在Hadoop生态之上的Database,源生对离线任务支持友好,又因为LSM树是一个优秀的高吞吐数据库结构,所以同时 ...

  2. 【2019.8.11上午 慈溪模拟赛 T3】欢迎回来(back)(设阈值+莫队)

    设阈值 考虑对于询问的\(d\)设阈值进行分别处理. 对于\(d\le\sqrt{max\ d}\)的询问,我们可以\(O(n\sqrt{max\ d})\)预处理答案,\(O(1)\)输出. 对于\ ...

  3. 阿里云cdn缓存设置技巧,不同文件结尾用不同的缓存时间

    https://edu.aliyun.com/lesson_130_1505?spm=5176.10731542.0.0.2ed37dbf42YL6U#_1505

  4. ShellScript值传递参数

    Shell传递参数 ######################################摘自菜鸟教程:http://www.runoob.com/linux/linux-shell-passi ...

  5. python 使用队列实现线程同步

    #通过queue的方式进行线程间同步,Queue在底层通过实现了dqueue(双生队列,在字节码时实现了线程安全)实现了线程安全 from queue import Queue import time ...

  6. iframe嵌套页面中的跳转

    简单说一下场景. 假设有A.B.C和D四个JSP页面,D通过iframe嵌套在C中,C通过iframe嵌套在B中,B通过iframe嵌套在A中. 然后现在在D中编写JavaScript代码跳转页面. ...

  7. 『珂朵莉树 Old Driver Tree』

    珂朵莉树 珂朵莉树其实不是树,只是一个借助平衡树实现的数据结构,主要是对于有区间赋值的数据结构题,可以用很暴力的代码很高效地完成任务,当然这是建立在数据随机的基础上的. 即使数据不是随机的,写一个珂朵 ...

  8. java的递归异常—一个异常可能由另一个异常触发

    关键字: Caused by nested exception java.lang.reflect.InvocationTargetException: null at sun.reflect.Nat ...

  9. Zabbix 设置自动添加主机两种方法(自动注册、自动发现)

    在实际生产环境中,我们可能需要将很多台主机添加到 Zabbix Server 里,我们进行手动添加的话,会比较麻烦.费时,而且还容易出错.所以一般我们会设置主机自动注册.这样就比较方便. 官方文档链接 ...

  10. App_Code下类无法引用问题

    App_Code 下创建的.cs文件仅仅是“内容”不是代码.设置文件为“编译”就可正常引用.