zoukankan      html  css  js  c++  java
  • 字符编码与函数

    本节目录:

    1、字符编码
    2、函数
      2.1参数
      2.2变量
      2.3返回值
      2.4递归
      2.5 编程范式
      2.6 高阶函数

    ************************************************************

    1、字符编码 
    py2 指定编码时,文件和变量为指定的编码;默认为ASICC
    py3 默认文件为utf-8,变量为unicode 只有unicode有encode方法
    先说python2

    py2里默认编码是ascii
    文件开头那个编码声明是告诉解释这个代码的程序 以什么编码格式 把这段代码读入到内存,因为到了内存里,这段代码其实是以bytes二进制格式存的,不过即使是2进制流,也可以按不同的编码格式转成2进制流。
    如果在文件头声明了#_*_coding:utf-8*_,就可以写中文了, 不声明的话,python在处理这段代码时按ascii,显然会出错, 加了这个声明后,里面的代码就全是utf-8格式了
    在有#_*_coding:utf-8*_的情况下,你在声明变量如果写成name=u"你好",那这个字符就是unicode格式,不加这个u,那你声明的字符串就是utf-8格式
    utf-8 to gbk怎么转,utf8先decode成unicode,再encode成gbk

    py3里默认文件编码就是utf-8,所以可以直接写中文,也不需要文件头声明编码了,干的漂亮
    你声明的变量默认是unicode编码,不是utf-8, 因为默认即是unicode了(不像在py2里,你想直接声明成unicode还得在变量前加个u), 此时你想转成gbk的话,直接your_str.encode("gbk")即可以
    但py3里,你在your_str.encode("gbk")时,感觉好像还加了一个动作,就是就是encode的数据变成了bytes里,因为在py3里,str and bytes做了明确的区分,你可以理解为bytes就是2进制流,你会说,我看到的不是010101这样的2进制呀, 那是因为python为了让你能对数据进行操作而在内存级别又帮你做了一层封装,否则让你直接看到一堆2进制。  
    py2里的bytes只是对str做了个别名,没有像py3一样给你显示的多出来一层封装,但其实其内部还是封装了的。 无论是2还是3, 从硬盘到内存,数据格式都是 010101二进制到-->b'xe4xbdxa0xe5xa5xbd' bytes类型-->按照指定编码转成你能看懂的文字
    编码应用比较多的场景应该是爬虫了,互联网上很多网站用的编码格式很杂,虽然整体趋向都变成utf-8,但现在还是很杂,所以爬网页时就需要你进行各种编码的转换。


    2、函数

    2.1参数 
    #位置参数name,age 默认参数country
    #默认参数必须在位置参数之后
    #非固定参数*args,**kwargs
    #关键字参数name='zs'
    #关键字参数必须放在后面,并且关键字参数和非固定参数不能混合使用
    #关键字参数和位置参数不能混合使用
    def sayhi(name,age,country='US',*args,**kwargs):
    #位置参数name,age 默认参数country
    #默认参数必须在位置参数之后
    #非固定参数*args,**kwargs
    print("HELLO, T am %s" % name,age,country)
    print("待定:",args,kwargs)
    def main():
    #name = input("name>>:")
    sayhi('zs',22,'CN','0001',SEX='F')
    #位置参数'zs'22、关键字参数name='zs'
    #关键字参数必须放在后面,并且关键字参数和非固定参数不能混合使用
    # print(sayhi)
    if __name__ == '__main__':
    main()

    2.2变量
    >>不建议使用
    global +参数名 将局部变量转换成全局变量 

    全局与局部变量
    在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
    全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
    当全局变量与局部变量同名时:
    在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。

    2.3返回值
    作用:
    1、函数经过调用并开始执行,则函数外部的程序无法左右函数的执行,外部程序必须等待函数的执行结果; 外部程序要根据函数的结果来判断下一步如何执行,函数执行结果以return形式返回给外部的程序
    2、return代表一个函数的结束,
    3、return可以返回任何值
    4、对于用户角度,函数可以返回任意数量的值,对于Python本身来讲,只能返回一个值(一个元组)

    2.4递归
    递归特性:

    1. 必须有一个明确的结束条件
    2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
    3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
    堆栈扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html

    #二分法
    def fen(dataset,find_num):
    if len(dataset) > 0:
    mid_pos = int(len(dataset)/2)
    if dataset[mid_pos] == find_num:
    print("find num",dataset[mid_pos])
    if dataset[mid_pos] > find_num:
    print("num left side",dataset[:mid_pos])
    fen(dataset[:mid_pos],find_num)
    if dataset[mid_pos] < find_num:
    print("num right side",dataset[mid_pos+1:])
    fen(dataset[mid_pos+1:],find_num)
    else:
    print("not find",find_num)
    date = [1,2,3,4,5,6,7,8,9,10,11,11]
    fen(date,1)
    输出:
    F:PythonPython3python.exe D:/python培训/our_python/day4/test.py
    num left side [1, 2, 3, 4, 5, 6]
    num left side [1, 2, 3]
    num left side [1]
    find num 1

    map(clac,range(10))
    map将后面列表中的每个值,传个clac函数运算

    2.5 编程范式 
    面向过程:解决具体的问题-使用函数较多
    面向对象:
    函数式编程:Erlang,Haskell
    函数式编程中的函数这个术语不是指计算机中的函数(实际上是Subroutine),而是指数学中的函数,即自变量的映射。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态

    2.6 高阶函数 
    变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数

    vars()=globals()把当前程序所有在内存中的全局数据以字典的形式打印出来;
    locals()把当前程序所有在内存中的局部数据以字典的形式打印出来;

  • 相关阅读:
    读书笔记之复盘
    读书笔记之大话设计模式
    代码重构之重命名
    代码重构之下降方法
    代码重构之提升方法
    代码重构之移动方法
    代码重构之封装集合
    JSON之实体对象转JSON字符串,字段名全部转为小写
    SQL代码之多组织数据汇总成树形表格展示
    Python socket学习笔记(三)
  • 原文地址:https://www.cnblogs.com/feiyu_Team/p/6032537.html
Copyright © 2011-2022 走看看