字符编码与函数

本节目录:

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()把当前程序所有在内存中的局部数据以字典的形式打印出来;

原文地址:https://www.cnblogs.com/feiyu_Team/p/6032537.html